1#!/usr/bin/perl 2# Copyright 2004 - Ryan Anderson <ryan@michonline.com> GPL v2 3 4use strict; 5use warnings; 6use Digest::MD5; 7require 5.006; 8 9if (@ARGV != 1) { 10 print <<EOT; 11Usage: setlocalversion <srctree> 12EOT 13 exit(1); 14} 15 16my ($srctree) = @ARGV; 17chdir($srctree); 18 19my @LOCALVERSIONS = (); 20 21# We are going to use the following commands to try and determine if this 22# repository is at a Version boundary (i.e, 2.6.10 vs 2.6.10 + some patches) We 23# currently assume that all meaningful version boundaries are marked by a tag. 24# We don't care what the tag is, just that something exists. 25 26# Git/Cogito store the top-of-tree "commit" in .git/HEAD 27# A list of known tags sits in .git/refs/tags/ 28# 29# The simple trick here is to just compare the two of these, and if we get a 30# match, return nothing, otherwise, return a subset of the SHA-1 hash in 31# .git/HEAD 32 33sub do_git_checks { 34 open(H,"<.git/HEAD") or return; 35 my $head = <H>; 36 chomp $head; 37 close(H); 38 39 opendir(D,".git/refs/tags") or return; 40 foreach my $tagfile (grep !/^\.{1,2}$/, readdir(D)) { 41 open(F,"<.git/refs/tags/" . $tagfile) or return; 42 my $tag = <F>; 43 chomp $tag; 44 close(F); 45 return if ($tag eq $head); 46 } 47 closedir(D); 48 49 push @LOCALVERSIONS, "g" . substr($head,0,8); 50} 51 52if ( -d ".git") { 53 do_git_checks(); 54} 55 56printf "-%s\n", join("-",@LOCALVERSIONS) if (scalar @LOCALVERSIONS > 0); 57