git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Support different branch layouts in git-p4

From
PWPete Wyckoff <pw@padd.com>
Date
Feb 10, 2011, 13:43 UTC
Message-ID
<20110210134306.GA4078@arf.padd.com>
In-Reply-To
<4D520E2B.2080200@vmware.com>
ianw@vmware.com wrote on Tue, 08 Feb 2011 19:46 -0800:
> So here's another version; I agree some testing would be good as I've
> only run it locally on //depot/proj/branch clients

This is good. Thanks for fixing it up. One last pedantic whine from me. Fix the regex for the error case:

    arf$ python
    >>> import re
    >>> re.match('\%\%d', "%%3")
    >>> re.match(r'%%\d', "%%3")
    >>> <_sre.SRE_Match object at 0x1ec4168>
		-- Pete
Show 104 quoted lines
> ---
> 
> diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4
> index 04ce7e3..3304f36 100755
> --- a/contrib/fast-import/git-p4
> +++ b/contrib/fast-import/git-p4
> @@ -910,6 +910,22 @@ class P4Sync(Command):
>          return files
>  
>      def stripRepoPath(self, path, prefixes):
> +        if self.useClientSpec:
> +
> +            # if using the client spec, we use the output directory
> +            # specified in the client.  For example, a view
> +            #   //depot/foo/branch/... //client/branch/foo/...
> +            # will end up putting all foo/branch files into
> +            #  branch/foo/
> +            for val in self.clientSpecDirs:
> +                if path.startswith(val[0]):
> +                    # replace the depot path with the client path
> +                    path = path.replace(val[0], val[1][1])
> +                    # now strip out the client (//client/...)
> +                    path = re.sub("^(//[^/]+/)", '', path)
> +                    # the rest is all path
> +                    return path
> +
>          if self.keepRepoPath:
>              prefixes = [re.sub("^(//[^/]+/).*", r'\1', prefixes[0])]
>  
> @@ -1032,7 +1048,7 @@ class P4Sync(Command):
>              includeFile = True
>              for val in self.clientSpecDirs:
>                  if f['path'].startswith(val[0]):
> -                    if val[1] <= 0:
> +                    if val[1][0] <= 0:
>                          includeFile = False
>                      break
>  
> @@ -1475,19 +1491,45 @@ class P4Sync(Command):
>          for entry in specList:
>              for k,v in entry.iteritems():
>                  if k.startswith("View"):
> +
> +                    # p4 has these %%1 to %%9 arguments in specs to
> +                    # reorder paths; which we can't handle (yet :)
> +                    if re.match('\%\%d', v) != None:
> +                        print "Sorry, can't handle %%n arguments in client specs"
> +                        sys.exit(1)
> +
>                      if v.startswith('"'):
>                          start = 1
>                      else:
>                          start = 0
>                      index = v.find("...")
> +
> +                    # save the "client view"; i.e the RHS of the view
> +                    # line that tells the client where to put the
> +                    # files for this view.
> +                    cv = v[index+3:].strip() # +3 to remove previous '...'
> +
> +                    # if the client view doesn't end with a
> +                    # ... wildcard, then we're going to mess up the
> +                    # output directory, so fail gracefully.
> +                    if not cv.endswith('...'):
> +                        print 'Sorry, client view in "%s" needs to end with wildcard' % (k)
> +                        sys.exit(1)
> +                    cv=cv[:-3]
> +
> +                    # now save the view; +index means included, -index
> +                    # means it should be filtered out.
>                      v = v[start:index]
>                      if v.startswith("-"):
>                          v = v[1:]
> -                        temp[v] = -len(v)
> +                        include = -len(v)
>                      else:
> -                        temp[v] = len(v)
> +                        include = len(v)
> +
> +                    temp[v] = (include, cv)
> +
>          self.clientSpecDirs = temp.items()
> -        self.clientSpecDirs.sort( lambda x, y: abs( y[1] ) - abs( x[1] ) )
> +        self.clientSpecDirs.sort( lambda x, y: abs( y[1][0] ) - abs( x[1][0] ) )
>  
>      def run(self, args):
>          self.depotPaths = []
> diff --git a/contrib/fast-import/git-p4.txt b/contrib/fast-import/git-p4.txt
> index 49b3359..e09da44 100644
> --- a/contrib/fast-import/git-p4.txt
> +++ b/contrib/fast-import/git-p4.txt
> @@ -191,6 +191,11 @@ git-p4.useclientspec
>  
>    git config [--global] git-p4.useclientspec false
>  
> +The P4CLIENT environment variable should be correctly set for p4 to be
> +able to find the relevant client.  This client spec will be used to
> +both filter the files cloned by git and set the directory layout as
> +specified in the client (this implies --keep-path style semantics).
> +
>  Implementation Details...
>  =========================
>  
> 
Previous: Ian WienandNext: Pete Wyckoff
Message 6 of 7 in “Support different branch layouts in git-p4”
  1. Support different branch layouts in git-p4Ian Wienand, Feb 1, 2011
  2. Tor Arvid LundFeb 5, 2011
  3. Ian WienandFeb 7, 2011
  4. Tor Arvid LundFeb 7, 2011
  5. Ian WienandFeb 9, 2011
  6. Pete WyckoffFeb 10, 2011
  7. Pete WyckoffFeb 8, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.