githead
Description: layout: default
Date: 2019-10-12T19:48:23-04:00

- # githead

  layout: default

      /**
       * #388 Manifest header to get GIT head Get the head commit number. Look
       * for a .git/HEAD file, going up in the file hierarchy. Then get this file,
       * and resolve any symbolic reference.
       *
       * @throws IOException
       */
      static Pattern	GITREF	= Pattern.compile("ref:\\s*(refs/(heads|tags|remotes)/([^\\s]+))\\s*");

      static String	_githeadHelp	= "${githead}, provide the SHA for the current git head";

      public String _githead(String[] args) throws IOException {
      	Macro.verifyCommand(args, _githeadHelp, null, 1, 1);

      	//
      	// Locate the .git directory
      	//

      	File rover = getBase();
      	while (rover !=null && rover.isDirectory()) {
      		File headFile = IO.getFile(rover, ".git/HEAD");
      		if (headFile.isFile()) {
      			//
      			// The head is either a symref (ref: refs/(heads|tags|remotes)/<name>)
      			//
      			String head = IO.collect(headFile).trim();
      			if (!Hex.isHex(head)) {
      				//
      				// Should be a symref
      				//
      				Matcher m = GITREF.matcher(head);
      				if (m.matches()) {

      					// so the commit is in the following path

      					head = IO.collect(IO.getFile(rover, ".git/" + m.group(1)));
      				}
      				else {
      					error("Git repo seems corrupt. It exists, find the HEAD but the content is neither hex nor a sym-ref: %s",
      							head);
      				}
      			}
      			return head.trim().toUpperCase();
      		}
      		rover = rover.getParentFile();
      	}
      	// Cannot find git directory
      	return "";
      }