Merge branch 'maint'
authorJunio C Hamano <gitster@pobox.com>
Mon, 27 Feb 2012 01:13:07 +0000 (17:13 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 27 Feb 2012 01:39:04 +0000 (17:39 -0800)
* maint:
  Document accumulated fixes since 1.7.9.2
  Git 1.7.8.5
  grep -P: Fix matching ^ and $
  am: don't infloop for an empty input file
  rebase -m: only call "notes copy" when rewritten exists and is non-empty
  git-p4: remove bash-ism in t9800
  git-p4: remove bash-ism in t9809
  git-p4: fix submit regression with clientSpec and subdir clone
  git-p4: set useClientSpec variable on initial clone
  Makefile: add thread-utils.h to LIB_H

Conflicts:
RelNotes
t/t9809-git-p4-client-view.sh

1  2 
Documentation/RelNotes/1.7.10.txt
Documentation/git-p4.txt
Makefile
contrib/fast-import/git-p4
git-am.sh
t/t4150-am.sh
t/t9809-git-p4-client-view.sh

index 0add762b0a03ebfdf0718cab071bd44c0e8b30cc,0000000000000000000000000000000000000000..364e16d0d5a40bae90cc97e0d6c610d3c3221f22
mode 100644,000000..100644
--- /dev/null
@@@ -1,109 -1,0 +1,100 @@@
-  * The config.mak.autogen generated by optional autoconf support tried
-    to link the binary with -lintl even when libintl.h is missing from
-    the system.
-    (merge a8356d4 js/configure-libintl later to maint).
-  * "git add --refresh <pathspec>" used to warn about unmerged paths
-    outside the given pathspec.
-    (merge 3d1f148 jc/add-refresh-unmerged later to maint).
 +Git v1.7.10 Release Notes
 +=========================
 +
 +Updates since v1.7.9
 +--------------------
 +
 +UI, Workflows & Features
 +
 + * Improved handling of views, labels and branches in git-p4 (in contrib).
 +
 + * "git-p4" (in contrib) suffered from unnecessary merge conflicts when
 +   p4 expanded the embedded $RCS$-like keywords; it can be now told to
 +   unexpand them.
 +
 + * Some "git-svn" updates.
 +
 + * "vcs-svn"/"svn-fe" learned to read dumps with svn-deltas and
 +   support incremental imports.
 +
 + * The configuration mechanism learned an "include" facility; an
 +   assignment to the include.path pseudo-variable causes the named
 +   file to be included in-place when Git looks up configuration
 +   variables.
 +
 + * "git am" learned to pass "-b" option to underlying "git mailinfo", so
 +   that bracketed string other than "PATCH" at the beginning can be kept.
 +
 + * "git clone" learned "--single-branch" option to limit cloning to a
 +   single branch (surprise!).
 +
 + * "git clone" learned to detach the HEAD in the resulting repository
 +   when the source repository's HEAD does not point to a branch.
 +
 + * When showing a patch while ignoring whitespace changes, the context
 +   lines are taken from the postimage, in order to make it easier to
 +   view the output.
 +
 + * "diff-highlight" filter (in contrib/) was updated to produce more
 +   aesthetically pleasing output.
 +
 + * "git tag --list" can be given "--points-at <object>" to limit its
 +   output to those that point at the given object.
 +
 + * "git merge" in an interactive session learned to spawn the editor
 +   by default to let the user edit the auto-generated merge message,
 +   to encourage people to explain their merges better. Legacy scripts
 +   can export MERGE_AUTOEDIT=no to retain the historical behaviour.
 +   Both "git merge" and "git pull" can be given --no-edit from the
 +   command line to accept the auto-generated merge message.
 +
 + * "gitweb" allows intermediate entries in the directory hierarchy
 +   that leads to a projects to be clicked, which in turn shows the
 +   list of projects inside that directory.
 +
 +Performance
 +
 + * During "git upload-pack" in respose to "git fetch", unnecessary calls
 +   to parse_object() have been eliminated, to help performance in
 +   repositories with excessive number of refs.
 +
 +Internal Implementation (please report possible regressions)
 +
 + * Recursive call chains in "git index-pack" to deal with long delta
 +   chains have been flattened, to reduce the stack footprint.
 +
 + * Use of add_extra_ref() API is now gone, to make it possible to
 +   cleanly restructure the overall refs API.
 +
 + * The command line parser of "git pack-objects" now uses parse-options
 +   API.
 +
 + * The test suite supports the new "test_pause" helper function.
 +
 + * Parallel to the test suite, there is a beginning of performance
 +   benchmarking framework.
 +
 + * t/Makefile is adjusted to prevent newer versions of GNU make from
 +   running tests in seemingly random order.
 +
 +Also contains minor documentation updates and code clean-ups.
 +
 +
 +Fixes since v1.7.9
 +------------------
 +
 +Unless otherwise noted, all the fixes since v1.7.9 in the maintenance
 +releases are contained in this release (see release notes to them for
 +details).
 +
 + * "gitweb" used to drop warnings in the log file when "heads" view is
 +   accessed in a repository whose HEAD does not point at a valid
 +   branch.
 +
 +---
 +exec >/var/tmp/1
 +O=v1.7.9.2-261-gd065f68
 +echo O=$(git describe)
 +git log --first-parent --oneline ^maint $O..
 +echo
 +git shortlog --no-merges ^maint $O..
Simple merge
diff --cc Makefile
Simple merge
index 053955349a92207b9f67aec73aa54143c2204129,9ccc87b2055a8f90fbe1fcc80649f6a72bb09a5e..c5362c4c11d00e169781ff7da89c88a3051f6227
@@@ -1530,9 -1477,8 +1579,10 @@@ class P4Sync(Command, P4UserMap)
          self.p4BranchesInGit = []
          self.cloneExclude = []
          self.useClientSpec = False
+         self.useClientSpec_from_options = False
          self.clientSpecDirs = None
 +        self.tempBranches = []
 +        self.tempBranchLocation = "git-p4-tmp"
  
          if gitConfig("git-p4.syncFromOrigin") == "false":
              self.syncWithOrigin = False
diff --cc git-am.sh
Simple merge
diff --cc t/t4150-am.sh
Simple merge
index ae9145e307dc1a3bc9ce14ccfac9bb1392b7d4ee,b0c6d4391daa041cf379f402704fb0989849e727..773a516ff0f40d396cb04cc474c697617192ae71
@@@ -246,393 -244,139 +250,526 @@@ test_expect_success 'quotes on rhs only
        git_verify "cdir 1/file11" "cdir 1/file12"
  '
  
+ #
+ # Submit tests
+ #
+ # clone sets variable
+ test_expect_success 'clone --use-client-spec sets useClientSpec' '
+       client_view "//depot/... //client/..." &&
+       test_when_finished cleanup_git &&
+       "$GITP4" clone --use-client-spec --dest="$git" //depot &&
+       (
+               cd "$git" &&
+               git config --bool git-p4.useClientSpec >actual &&
+               echo true >true &&
+               test_cmp actual true
+       )
+ '
+ # clone just a subdir of the client spec
+ test_expect_success 'subdir clone' '
+       client_view "//depot/... //client/..." &&
+       files="dir1/file11 dir1/file12 dir2/file21 dir2/file22" &&
+       client_verify $files &&
+       test_when_finished cleanup_git &&
+       "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
+       git_verify dir1/file11 dir1/file12
+ '
+ #
+ # submit back, see what happens:  five cases
+ #
+ test_expect_success 'subdir clone, submit modify' '
+       client_view "//depot/... //client/..." &&
+       test_when_finished cleanup_git &&
+       "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
+       (
+               cd "$git" &&
+               git config git-p4.skipSubmitEdit true &&
+               echo line >>dir1/file12 &&
+               git add dir1/file12 &&
+               git commit -m dir1/file12 &&
+               "$GITP4" submit
+       ) &&
+       (
+               cd "$cli" &&
+               test_path_is_file dir1/file12 &&
+               test_line_count = 2 dir1/file12
+       )
+ '
+ test_expect_success 'subdir clone, submit add' '
+       client_view "//depot/... //client/..." &&
+       test_when_finished cleanup_git &&
+       "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
+       (
+               cd "$git" &&
+               git config git-p4.skipSubmitEdit true &&
+               echo file13 >dir1/file13 &&
+               git add dir1/file13 &&
+               git commit -m dir1/file13 &&
+               "$GITP4" submit
+       ) &&
+       (
+               cd "$cli" &&
+               test_path_is_file dir1/file13
+       )
+ '
+ test_expect_success 'subdir clone, submit delete' '
+       client_view "//depot/... //client/..." &&
+       test_when_finished cleanup_git &&
+       "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
+       (
+               cd "$git" &&
+               git config git-p4.skipSubmitEdit true &&
+               git rm dir1/file12 &&
+               git commit -m "delete dir1/file12" &&
+               "$GITP4" submit
+       ) &&
+       (
+               cd "$cli" &&
+               test_path_is_missing dir1/file12
+       )
+ '
+ test_expect_success 'subdir clone, submit copy' '
+       client_view "//depot/... //client/..." &&
+       test_when_finished cleanup_git &&
+       "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
+       (
+               cd "$git" &&
+               git config git-p4.skipSubmitEdit true &&
+               git config git-p4.detectCopies true &&
+               cp dir1/file11 dir1/file11a &&
+               git add dir1/file11a &&
+               git commit -m "copy to dir1/file11a" &&
+               "$GITP4" submit
+       ) &&
+       (
+               cd "$cli" &&
+               test_path_is_file dir1/file11a
+       )
+ '
+ test_expect_success 'subdir clone, submit rename' '
+       client_view "//depot/... //client/..." &&
+       test_when_finished cleanup_git &&
+       "$GITP4" clone --use-client-spec --dest="$git" //depot/dir1 &&
+       (
+               cd "$git" &&
+               git config git-p4.skipSubmitEdit true &&
+               git config git-p4.detectRenames true &&
+               git mv dir1/file13 dir1/file13a &&
+               git commit -m "rename dir1/file13 to dir1/file13a" &&
+               "$GITP4" submit
+       ) &&
+       (
+               cd "$cli" &&
+               test_path_is_missing dir1/file13 &&
+               test_path_is_file dir1/file13a
+       )
+ '
+ test_expect_success 'reinit depot' '
+       (
+               cd "$cli" &&
+               p4 sync -f &&
+               rm files &&
+               p4 delete */* &&
+               p4 submit -d "delete all files" &&
+               init_depot
+       )
+ '
 +#
 +# What happens when two files of the same name are overlayed together?
 +# The last-listed file should take preference.
 +#
 +# //depot
 +#   - dir1
 +#     - file11
 +#     - file12
 +#     - filecollide
 +#   - dir2
 +#     - file21
 +#     - file22
 +#     - filecollide
 +#
 +test_expect_success 'overlay collision setup' '
 +      client_view "//depot/... //client/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              echo dir1/filecollide >dir1/filecollide &&
 +              p4 add dir1/filecollide &&
 +              p4 submit -d dir1/filecollide &&
 +              echo dir2/filecollide >dir2/filecollide &&
 +              p4 add dir2/filecollide &&
 +              p4 submit -d dir2/filecollide
 +      )
 +'
 +
 +test_expect_success 'overlay collision 1 to 2' '
 +      client_view "//depot/dir1/... //client/..." \
 +                  "+//depot/dir2/... //client/..." &&
 +      files="file11 file12 file21 file22 filecollide" &&
 +      echo dir2/filecollide >actual &&
 +      client_verify $files &&
 +      test_cmp actual "$cli"/filecollide &&
 +      test_when_finished cleanup_git &&
 +      "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 +      git_verify $files &&
 +      test_cmp actual "$git"/filecollide
 +'
 +
 +test_expect_failure 'overlay collision 2 to 1' '
 +      client_view "//depot/dir2/... //client/..." \
 +                  "+//depot/dir1/... //client/..." &&
 +      files="file11 file12 file21 file22 filecollide" &&
 +      echo dir1/filecollide >actual &&
 +      client_verify $files &&
 +      test_cmp actual "$cli"/filecollide &&
 +      test_when_finished cleanup_git &&
 +      "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 +      git_verify $files &&
 +      test_cmp actual "$git"/filecollide
 +'
 +
 +test_expect_success 'overlay collision delete 2' '
 +      client_view "//depot/... //client/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              p4 delete dir2/filecollide &&
 +              p4 submit -d "remove dir2/filecollide"
 +      )
 +'
 +
 +# no filecollide, got deleted with dir2
 +test_expect_failure 'overlay collision 1 to 2, but 2 deleted' '
 +      client_view "//depot/dir1/... //client/..." \
 +                  "+//depot/dir2/... //client/..." &&
 +      files="file11 file12 file21 file22" &&
 +      client_verify $files &&
 +      test_when_finished cleanup_git &&
 +      "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 +      git_verify $files
 +'
 +
 +test_expect_success 'overlay collision update 1' '
 +      client_view "//depot/dir1/... //client/dir1/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              p4 open dir1/filecollide &&
 +              echo dir1/filecollide update >dir1/filecollide &&
 +              p4 submit -d "update dir1/filecollide"
 +      )
 +'
 +
 +# still no filecollide, dir2 still wins with the deletion even though the
 +# change to dir1 is more recent
 +test_expect_failure 'overlay collision 1 to 2, but 2 deleted, then 1 updated' '
 +      client_view "//depot/dir1/... //client/..." \
 +                  "+//depot/dir2/... //client/..." &&
 +      files="file11 file12 file21 file22" &&
 +      client_verify $files &&
 +      test_when_finished cleanup_git &&
 +      "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 +      git_verify $files
 +'
 +
 +test_expect_success 'overlay collision delete filecollides' '
 +      client_view "//depot/... //client/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              p4 delete dir1/filecollide dir2/filecollide &&
 +              p4 submit -d "remove filecollides"
 +      )
 +'
 +
 +#
 +# Overlays as part of sync, rather than initial checkout:
 +#   1.  add a file in dir1
 +#   2.  sync to include it
 +#   3.  add same file in dir2
 +#   4.  sync, make sure content switches as dir2 has priority
 +#   5.  add another file in dir1
 +#   6.  sync
 +#   7.  add/delete same file in dir2
 +#   8.  sync, make sure it disappears, again dir2 wins
 +#   9.  cleanup
 +#
 +# //depot
 +#   - dir1
 +#     - file11
 +#     - file12
 +#     - colA
 +#     - colB
 +#   - dir2
 +#     - file21
 +#     - file22
 +#     - colA
 +#     - colB
 +#
 +test_expect_success 'overlay sync: add colA in dir1' '
 +      client_view "//depot/dir1/... //client/dir1/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              echo dir1/colA >dir1/colA &&
 +              p4 add dir1/colA &&
 +              p4 submit -d dir1/colA
 +      )
 +'
 +
 +test_expect_success 'overlay sync: initial git checkout' '
 +      client_view "//depot/dir1/... //client/..." \
 +                  "+//depot/dir2/... //client/..." &&
 +      files="file11 file12 file21 file22 colA" &&
 +      echo dir1/colA >actual &&
 +      client_verify $files &&
 +      test_cmp actual "$cli"/colA &&
 +      "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 +      git_verify $files &&
 +      test_cmp actual "$git"/colA
 +'
 +
 +test_expect_success 'overlay sync: add colA in dir2' '
 +      client_view "//depot/dir2/... //client/dir2/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              echo dir2/colA >dir2/colA &&
 +              p4 add dir2/colA &&
 +              p4 submit -d dir2/colA
 +      )
 +'
 +
 +test_expect_success 'overlay sync: colA content switch' '
 +      client_view "//depot/dir1/... //client/..." \
 +                  "+//depot/dir2/... //client/..." &&
 +      files="file11 file12 file21 file22 colA" &&
 +      echo dir2/colA >actual &&
 +      client_verify $files &&
 +      test_cmp actual "$cli"/colA &&
 +      (
 +              cd "$git" &&
 +              "$GITP4" sync --use-client-spec &&
 +              git merge --ff-only p4/master
 +      ) &&
 +      git_verify $files &&
 +      test_cmp actual "$git"/colA
 +'
 +
 +test_expect_success 'overlay sync: add colB in dir1' '
 +      client_view "//depot/dir1/... //client/dir1/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              echo dir1/colB >dir1/colB &&
 +              p4 add dir1/colB &&
 +              p4 submit -d dir1/colB
 +      )
 +'
 +
 +test_expect_success 'overlay sync: colB appears' '
 +      client_view "//depot/dir1/... //client/..." \
 +                  "+//depot/dir2/... //client/..." &&
 +      files="file11 file12 file21 file22 colA colB" &&
 +      echo dir1/colB >actual &&
 +      client_verify $files &&
 +      test_cmp actual "$cli"/colB &&
 +      (
 +              cd "$git" &&
 +              "$GITP4" sync --use-client-spec &&
 +              git merge --ff-only p4/master
 +      ) &&
 +      git_verify $files &&
 +      test_cmp actual "$git"/colB
 +'
 +
 +test_expect_success 'overlay sync: add/delete colB in dir2' '
 +      client_view "//depot/dir2/... //client/dir2/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              echo dir2/colB >dir2/colB &&
 +              p4 add dir2/colB &&
 +              p4 submit -d dir2/colB &&
 +              p4 delete dir2/colB &&
 +              p4 submit -d "delete dir2/colB"
 +      )
 +'
 +
 +test_expect_success 'overlay sync: colB disappears' '
 +      client_view "//depot/dir1/... //client/..." \
 +                  "+//depot/dir2/... //client/..." &&
 +      files="file11 file12 file21 file22 colA" &&
 +      client_verify $files &&
 +      test_when_finished cleanup_git &&
 +      (
 +              cd "$git" &&
 +              "$GITP4" sync --use-client-spec &&
 +              git merge --ff-only p4/master
 +      ) &&
 +      git_verify $files
 +'
 +
 +test_expect_success 'overlay sync: cleanup' '
 +      client_view "//depot/... //client/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              p4 delete dir1/colA dir2/colA dir1/colB &&
 +              p4 submit -d "remove overlay sync files"
 +      )
 +'
 +
 +#
 +# Overlay tests again, but swapped so dir1 has priority.
 +#   1.  add a file in dir1
 +#   2.  sync to include it
 +#   3.  add same file in dir2
 +#   4.  sync, make sure content does not switch
 +#   5.  add another file in dir1
 +#   6.  sync
 +#   7.  add/delete same file in dir2
 +#   8.  sync, make sure it is still there
 +#   9.  cleanup
 +#
 +# //depot
 +#   - dir1
 +#     - file11
 +#     - file12
 +#     - colA
 +#     - colB
 +#   - dir2
 +#     - file21
 +#     - file22
 +#     - colA
 +#     - colB
 +#
 +test_expect_success 'overlay sync swap: add colA in dir1' '
 +      client_view "//depot/dir1/... //client/dir1/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              echo dir1/colA >dir1/colA &&
 +              p4 add dir1/colA &&
 +              p4 submit -d dir1/colA
 +      )
 +'
 +
 +test_expect_success 'overlay sync swap: initial git checkout' '
 +      client_view "//depot/dir2/... //client/..." \
 +                  "+//depot/dir1/... //client/..." &&
 +      files="file11 file12 file21 file22 colA" &&
 +      echo dir1/colA >actual &&
 +      client_verify $files &&
 +      test_cmp actual "$cli"/colA &&
 +      "$GITP4" clone --use-client-spec --dest="$git" //depot &&
 +      git_verify $files &&
 +      test_cmp actual "$git"/colA
 +'
 +
 +test_expect_success 'overlay sync swap: add colA in dir2' '
 +      client_view "//depot/dir2/... //client/dir2/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              echo dir2/colA >dir2/colA &&
 +              p4 add dir2/colA &&
 +              p4 submit -d dir2/colA
 +      )
 +'
 +
 +test_expect_failure 'overlay sync swap: colA no content switch' '
 +      client_view "//depot/dir2/... //client/..." \
 +                  "+//depot/dir1/... //client/..." &&
 +      files="file11 file12 file21 file22 colA" &&
 +      echo dir1/colA >actual &&
 +      client_verify $files &&
 +      test_cmp actual "$cli"/colA &&
 +      (
 +              cd "$git" &&
 +              "$GITP4" sync --use-client-spec &&
 +              git merge --ff-only p4/master
 +      ) &&
 +      git_verify $files &&
 +      test_cmp actual "$git"/colA
 +'
 +
 +test_expect_success 'overlay sync swap: add colB in dir1' '
 +      client_view "//depot/dir1/... //client/dir1/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              echo dir1/colB >dir1/colB &&
 +              p4 add dir1/colB &&
 +              p4 submit -d dir1/colB
 +      )
 +'
 +
 +test_expect_success 'overlay sync swap: colB appears' '
 +      client_view "//depot/dir2/... //client/..." \
 +                  "+//depot/dir1/... //client/..." &&
 +      files="file11 file12 file21 file22 colA colB" &&
 +      echo dir1/colB >actual &&
 +      client_verify $files &&
 +      test_cmp actual "$cli"/colB &&
 +      (
 +              cd "$git" &&
 +              "$GITP4" sync --use-client-spec &&
 +              git merge --ff-only p4/master
 +      ) &&
 +      git_verify $files &&
 +      test_cmp actual "$git"/colB
 +'
 +
 +test_expect_success 'overlay sync swap: add/delete colB in dir2' '
 +      client_view "//depot/dir2/... //client/dir2/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              echo dir2/colB >dir2/colB &&
 +              p4 add dir2/colB &&
 +              p4 submit -d dir2/colB &&
 +              p4 delete dir2/colB &&
 +              p4 submit -d "delete dir2/colB"
 +      )
 +'
 +
 +test_expect_failure 'overlay sync swap: colB no change' '
 +      client_view "//depot/dir2/... //client/..." \
 +                  "+//depot/dir1/... //client/..." &&
 +      files="file11 file12 file21 file22 colA colB" &&
 +      echo dir1/colB >actual &&
 +      client_verify $files &&
 +      test_cmp actual "$cli"/colB &&
 +      test_when_finished cleanup_git &&
 +      (
 +              cd "$git" &&
 +              "$GITP4" sync --use-client-spec &&
 +              git merge --ff-only p4/master
 +      ) &&
 +      git_verify $files &&
 +      test_cmp actual "$cli"/colB
 +'
 +
 +test_expect_success 'overlay sync swap: cleanup' '
 +      client_view "//depot/... //client/..." &&
 +      (
 +              cd "$cli" &&
 +              p4 sync &&
 +              p4 delete dir1/colA dir2/colA dir1/colB &&
 +              p4 submit -d "remove overlay sync files"
 +      )
 +'
 +
  #
  # Rename directories to test quoting in depot-side mappings
  # //depot