Print this page
Let webrev recognize git

*** 1777,1786 **** --- 1777,1822 ---- # flist_from_wx prints the Done, so we don't have to. flist_from_wx $TMPFLIST } # + # Call git-active to get the active list output in the wx active list format + # + function git_active_wxfile + { + typeset child=$1 + typeset parent=$2 + + TMPFLIST=/tmp/$$.active + $GIT_ACTIVE -w $child -p $parent -o $TMPFLIST + wxfile=$TMPFLIST + } + + # + # flist_from_git + # Call git-active to get a wx-style active list, and hand it off to + # flist_from_wx + # + function flist_from_git + { + typeset child=$1 + typeset parent=$2 + + print " File list from: git-active -p $parent ...\c" + + if [[ ! -x $GIT_ACTIVE ]]; then + print # Blank line for the \c above + print -u2 "Error: git-active tool not found. Exiting" + exit 1 + fi + git_active_wxfile $child $parent + + # flist_from_wx prints the Done, so we don't have to. + flist_from_wx $TMPFLIST + } + + # # flist_from_subversion # # Generate the file list by extracting file names from svn status. # function flist_from_subversion
*** 1996,2005 **** --- 2032,2092 ---- fi fi fi } + function build_old_new_git + { + typeset olddir="$1" + typeset newdir="$2" + typeset old_mode= + typeset new_mode= + typeset old_object= + typeset new_object= + typeset file + typeset type + + # + # Get old file and its mode from the git object tree + # + if [[ "$PDIR" == "." ]]; then + file="$PF" + else + file="$PDIR/$PF" + fi + git ls-tree $GIT_PARENT $file | read old_mode type old_object junk + git cat-file $type $old_object > $olddir/$file 2>/dev/null + + if (( $? != 0 )); then + rm -f $olddir/$PDIR/$PF + else + if [[ -n $old_mode ]]; then + chmod $old_mode $olddir/$PDIR/$PF + else + # should never happen + print -u2 "ERROR: set mode of $olddir/$PDIR/$PF" + fi + fi + + # + # new version of the file. + # + rm -rf $newdir/$DIR/$F + if [[ -e $CWS/../$DIR/$F ]]; then + cp $CWS/../$DIR/$F $newdir/$DIR/$F + # Temporary new_node = old_mode + new_mode=$old_mode + if [[ -n $new_mode ]]; then + chmod $new_mode $newdir/$DIR/$F + else + # should never happen + print -u2 "ERROR: set mode of $newdir/$DIR/$F" + fi + fi + + } + function build_old_new_subversion { typeset olddir="$1" typeset newdir="$2"
*** 2056,2065 **** --- 2143,2154 ---- if [[ $SCM_MODE == "teamware" ]]; then build_old_new_teamware "$olddir" "$newdir" elif [[ $SCM_MODE == "mercurial" ]]; then build_old_new_mercurial "$olddir" "$newdir" + elif [[ $SCM_MODE == "git" ]]; then + build_old_new_git "$olddir" "$newdir" elif [[ $SCM_MODE == "subversion" ]]; then build_old_new_subversion "$olddir" "$newdir" elif [[ $SCM_MODE == "unknown" ]]; then build_old_new_unknown "$olddir" "$newdir" fi
*** 2122,2131 **** --- 2211,2221 ---- PATH=$(dirname $(whence $0)):$PATH [[ -z $WDIFF ]] && WDIFF=`look_for_prog wdiff` [[ -z $WX ]] && WX=`look_for_prog wx` [[ -z $HG_ACTIVE ]] && HG_ACTIVE=`look_for_prog hg-active` + [[ -z $GIT_ACTIVE ]] && GIT_ACTIVE=`look_for_prog git-active` [[ -z $WHICH_SCM ]] && WHICH_SCM=`look_for_prog which_scm` [[ -z $CODEREVIEW ]] && CODEREVIEW=`look_for_prog codereview` [[ -z $PS2PDF ]] && PS2PDF=`look_for_prog ps2pdf` [[ -z $PERL ]] && PERL=`look_for_prog perl` [[ -z $RSYNC ]] && RSYNC=`look_for_prog rsync`
*** 2287,2296 **** --- 2377,2398 ---- # [[ -z $codemgr_ws && -n $CODEMGR_WS ]] && \ codemgr_ws=$(hg root -R $CODEMGR_WS 2>/dev/null) [[ -z $codemgr_ws ]] && codemgr_ws=$(hg root 2>/dev/null) CWS=$codemgr_ws + elif [[ $SCM_MODE == "git" ]]; then + # + # Git priorities: + # 1. git rev-parse --git-dir from CODEMGR_WS environment variable + # 2. git rev-parse --git-dir from directory of invocation + # + [[ -z $codemgr_ws && -n $CODEMGR_WS ]] && \ + codemgr_ws=$(git --git-dir=$CODEMGR_WS rev-parse --git-dir \ + 2>/dev/null) + [[ -z $codemgr_ws ]] && \ + codemgr_ws=$(git rev-parse --git-dir 2>/dev/null) + CWS=$codemgr_ws elif [[ $SCM_MODE == "subversion" ]]; then # # Subversion priorities: # 1. CODEMGR_WS from environment # 2. Relative path from current directory to SVN repository root
*** 2372,2382 **** # # Before we go on to further consider -l and -w, work out which SCM we think # is in use. # case "$SCM_MODE" in ! teamware|mercurial|subversion) ;; unknown) if [[ $flist_mode == "auto" ]]; then print -u2 "Unable to determine SCM in use and file list not specified" print -u2 "See which_scm(1) for SCM detection information." --- 2474,2484 ---- # # Before we go on to further consider -l and -w, work out which SCM we think # is in use. # case "$SCM_MODE" in ! teamware|mercurial|git|subversion) ;; unknown) if [[ $flist_mode == "auto" ]]; then print -u2 "Unable to determine SCM in use and file list not specified" print -u2 "See which_scm(1) for SCM detection information."
*** 2516,2525 **** --- 2618,2628 ---- print -u2 "$CODEMGR_PARENT: no such parent workspace" exit 1 fi PWS=$codemgr_parent + \ [[ -n $parent_webrev ]] && RWS=$(workspace parent $CWS) elif [[ $SCM_MODE == "mercurial" ]]; then #
*** 2598,2607 **** --- 2701,2792 ---- eval `$SED -e "s/#.*$//" | $GREP HG_PARENT=` elif [[ -z $HG_PARENT ]]; then print -u2 "Error: Cannot discover parent revision" exit 1 fi + elif [[ $SCM_MODE == "git" ]]; then + # + # Parent can either be specified with -p + # Specified with CODEMGR_PARENT in the environment + # or taken from git config. + # + + if [[ -z $codemgr_parent && -n $CODEMGR_PARENT ]]; then + codemgr_parent=$CODEMGR_PARENT + fi + + if [[ -z $codemgr_parent ]]; then + codemgr_parent=$(git --git-dir=$codemgr_ws config \ + remote.origin.url 2>/dev/null) + fi + + CWS_REV=$(git --git-dir=$codemgr_ws rev-parse HEAD 2>/dev/null) + PWS=$codemgr_parent + + # + # If the parent is a webrev, we want to do some things against + # the natural workspace parent (file list, comments, etc) + # + if [[ -n $parent_webrev ]]; then + real_parent=$(git --git-dir $codemgr_ws config \ + remote.origin.url 2>/dev/null) + else + real_parent=$PWS + fi + + # + # If git-active exists, then we run it. In the case of no explicit + # flist given, we'll use it for our comments. In the case of an + # explicit flist given we'll try to use it for comments for any + # files mentioned in the flist. + # + if [[ -z $flist_done ]]; then + flist_from_git $CWS $real_parent + flist_done=1 + fi + + # + # If we have a file list now, pull out any variables set + # therein. We do this now (rather than when we possibly use + # git-active to find comments) to avoid stomping specifications + # in the user-specified flist. + # + if [[ -n $flist_done ]]; then + env_from_flist + fi + + # + # Only call git-active if we don't have a wx formatted file already + # + if [[ -x $GIT_ACTIVE && -z $wxfile ]]; then + print " Comments from: git-active -p $real_parent ...\c" + git_active_wxfile $CWS $real_parent + print " Done." + fi + + # + # At this point we must have a wx flist either from git-active, + # or in general. Use it to try and find our parent revision, + # if we don't have one. + # + if [[ -z $GIT_PARENT ]]; then + eval `$SED -e "s/#.*$//" $wxfile | $GREP GIT_PARENT=` + fi + + # + # If we still don't have a parent, we must have been given a + # wx-style active list with no GIT_PARENT specification, run + # git-active and pull an GIT_PARENT out of it, ignore the rest. + # + if [[ -z $GIT_PARENT && -x $GIT_ACTIVE ]]; then + $GIT_ACTIVE -w $codemgr_ws -p $real_parent | \ + eval `$SED -e "s/#.*$//" | $GREP GIT_PARENT=` + elif [[ -z $GIT_PARENT ]]; then + print -u2 "Error: Cannot discover parent revision" + exit 1 + fi + WDIR=${WDIR:-$CWS/../webrev} elif [[ $SCM_MODE == "subversion" ]]; then # # We only will have a real parent workspace in the case one # was specified (be it an older webrev, or another checkout).