<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>README</title> <style type="text/css"> /** * prism.js default theme for JavaScript, CSS and HTML * Based on dabblet (http://dabblet.com) * @author Lea Verou */ code[class*="language-"], pre[class*="language-"] { color: black; text-shadow: 0 1px white; font-family: Consolas, Monaco, 'Andale Mono', monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #b3d4fc; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #b3d4fc; } @media print { code[class*="language-"], pre[class*="language-"] { text-shadow: none; } } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre) > code[class*="language-"], pre[class*="language-"] { background: #f5f2f0; } /* Inline code */ :not(pre) > code[class*="language-"] { padding: .1em; border-radius: .3em; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: slategray; } .token.punctuation { color: #999; } .namespace { opacity: .7; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: #905; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #690; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #a67f59; background: hsla(0, 0%, 100%, .5); } .token.atrule, .token.attr-value, .token.keyword { color: #07a; } .token.function { color: #DD4A68; } .token.regex, .token.important, .token.variable { color: #e90; } .token.important { font-weight: bold; } .token.entity { cursor: help; } </style> </head> <body> <h1 id="toc_0">Perforce Baseline and Branch Import (P4BBI)</h1> <h2 id="toc_1">Welcome </h2> <p>This is the home of the Perforce Baseline & Branch Import tool, P4BBI.</p> <h2 id="toc_2">Introduction </h2> <p>The P4BBI tool supports the migration strategy mentioned in the blog article,</p> <p><a href="http://www.perforce.com/blog/090804/baseline-branch-import-bbi-migration-strategy">Baseline and Branch Import (BBI) - A Migration Strategy</a>. This strategy has been used by many companies over the years to quickly migrate from any number of legacy SCM systems to Perforce.</p> <h2 id="toc_3">Going Through The Front Door</h2> <p>The BBI approach is "front door" to Perforce. "Front door" means that it accesses Perforce using the same interface that a human user would, such as the command line interface or published APIs (like P4Perl, P4Python, P4PHP, P4Ruby, P4Java, the C++ API, etc.). This particular tool uses only the 'p4' command line only.</p> <p>A key benefit of a front door approach is that it can be operated against a live, running Perforce server, without needing downtime. Another benefit is that no special permissions are required; only write access to target depot paths is needed (depending on features used; some requrie super user access). Typically dry runs are performed into a stand-alone test server for verification purposes, and final imports are done into a live server.</p> <h2 id="toc_4">P4D Compatibility</h2> <p>This version of the P4BBI tool tested with P4D 2015.2 servers. It should work with older and newer versions as well, with some known exceptions:</p> <ul> <li>Use of the RENAME action in BBI config files requires P4D 2009.1+</li> <li>Use of Streams features requires at least P4D 2011.1, but may may require newer versions depending on stream specs used.</li> </ul> <p>If you just want the latest released version of the file, it is in the Perforce server here:</p> <p><a href="https://swarm.workshop.perforce.com/projects/perforce_software-p4bbi/files/dist/p4bbi.tgz">https://swarm.workshop.perforce.com/projects/perforce_software-p4bbi/files/dist/p4bbi.tgz</a></p> <h2 id="toc_5">Contact Us</h2> <p>Please contact Perforce Consulting (mailto:Consulting@Perforce.com) for more information.</p> <h1 id="toc_6"></h1> <h2 id="toc_7">Contributing by Shelving</h2> <p>All registered Workshop users have <strong>open</strong> access (but not <strong>write</strong>) to the P4BBI project, specifically to these paths:</p> <pre><code>//guest/perforce_software/p4bbi/dev/... </code></pre> <p>The <strong>open</strong> access level confers the ability to edit and <strong>shelve</strong> changes for a pre-commit review process. We'll review the change, and either incorporate it or provide feedback. Be sure to provide a detailed change description, and also include the tag/text "<CODE>#review</CODE>" in your changelist description before you shelve it, in order to initiate a Swarm code review. (If you forget, just modify your changelist description to add the <CODE>#review</CODE> tag, and then force-shelve it again).</p> <p>Contributing by shelving is ideal if you changes are relatively small in scope, and if they're more solid than experimental.</p> <h2 id="toc_8">Contributing by Branching</h2> <p>Optionally, you may also branch the p4bbi folder, or some subset of it, into your own guest area. Creating a branch spec is recommended for this purpose, e.g. with a branch spec something like this:</p> <pre><code>Branch: your_name-p4bbi Owner: your_name Description: P4BBI Updates by your_name. Options: unlocked View: //guest/perforce_software/p4bbi/main/... //guest/your_name/p4bbi/main/... </code></pre> <p>Edit, test and submit changes in your branch. Then when you are done, send us an email <a href="mailto:consulting@perforce.com?subject=BBI%20Pull%20Request">consulting@perforce.com</a> which servers as a pull request, and tell us what you'd like us to know about your change.</p> <p>Contributing by branching is a better option of your changes are larger in scope, or more experimental in nature.</p> <h2 id="toc_9">Guidelines for P4BBI Contributors</h2> <ul> <li>Communicate using <a href="https://swarm.workshop.perforce.com/projects/perforce_software-p4bbi">this Swarm page</a>! Follow this project, comment on features, and let folks know what you're planning before you work hard on something that might already be underway. Or take your own crack at it!</li> <li><p>Review the <a href="https://swarm.workshop.perforce.com/projects/perforce_software-p4bbi/jobs">list of non-closed jobs</a>. Or you can get that from the command line:</p> <p><code>p4 jobs -l -e "Project=perforce_software-p4bbi ^Status=closed"</code></p></li> <li><p>File bugs or feature requests. Use the 'p4 job' command, setting <strong>Project=perforce_software-p4bbi</strong>, and also set Type field to <strong>Feature</strong> or <strong>Bug</strong>.</p></li> <li><p>Filing a job is not strictly required, but increases the transparency of what you're doing, and helps promote it.</p></li> <li><p>Generic changes with a wide appeal are more likely to get implemented.</p></li> </ul> <script type="text/javascript"> self=typeof window!="undefined"?window:typeof WorkerGlobalScope!="undefined"&&self instanceof WorkerGlobalScope?self:{};var Prism=function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={util:{encode:function(e){return e instanceof n?new n(e.type,t.util.encode(e.content),e.alias):t.util.type(e)==="Array"?e.map(t.util.encode):e.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},clone:function(e){var n=t.util.type(e);switch(n){case"Object":var r={};for(var i in e)e.hasOwnProperty(i)&&(r[i]=t.util.clone(e[i]));return r;case"Array":return e.slice()}return e}},languages:{extend:function(e,n){var r=t.util.clone(t.languages[e]);for(var i in n)r[i]=n[i];return r},insertBefore:function(e,n,r,i){i=i||t.languages;var s=i[e];if(arguments.length==2){r=arguments[1];for(var o in r)r.hasOwnProperty(o)&&(s[o]=r[o]);return s}var u={};for(var a in s)if(s.hasOwnProperty(a)){if(a==n)for(var o in r)r.hasOwnProperty(o)&&(u[o]=r[o]);u[a]=s[a]}t.languages.DFS(t.languages,function(t,n){n===i[e]&&t!=e&&(this[t]=u)});return i[e]=u},DFS:function(e,n,r){for(var i in e)if(e.hasOwnProperty(i)){n.call(e,i,e[i],r||i);t.util.type(e[i])==="Object"?t.languages.DFS(e[i],n):t.util.type(e[i])==="Array"&&t.languages.DFS(e[i],n,i)}}},highlightAll:function(e,n){var r=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');for(var i=0,s;s=r[i++];)t.highlightElement(s,e===!0,n)},highlightElement:function(r,i,s){var o,u,a=r;while(a&&!e.test(a.className))a=a.parentNode;if(a){o=(a.className.match(e)||[,""])[1];u=t.languages[o]}if(!u)return;r.className=r.className.replace(e,"").replace(/\s+/g," ")+" language-"+o;a=r.parentNode;/pre/i.test(a.nodeName)&&(a.className=a.className.replace(e,"").replace(/\s+/g," ")+" language-"+o);var f=r.textContent;if(!f)return;var l={element:r,language:o,grammar:u,code:f};t.hooks.run("before-highlight",l);if(i&&self.Worker){var c=new Worker(t.filename);c.onmessage=function(e){l.highlightedCode=n.stringify(JSON.parse(e.data),o);t.hooks.run("before-insert",l);l.element.innerHTML=l.highlightedCode;s&&s.call(l.element);t.hooks.run("after-highlight",l)};c.postMessage(JSON.stringify({language:l.language,code:l.code}))}else{l.highlightedCode=t.highlight(l.code,l.grammar,l.language);t.hooks.run("before-insert",l);l.element.innerHTML=l.highlightedCode;s&&s.call(r);t.hooks.run("after-highlight",l)}},highlight:function(e,r,i){var s=t.tokenize(e,r);return n.stringify(t.util.encode(s),i)},tokenize:function(e,n,r){var i=t.Token,s=[e],o=n.rest;if(o){for(var u in o)n[u]=o[u];delete n.rest}e:for(var u in n){if(!n.hasOwnProperty(u)||!n[u])continue;var a=n[u];a=t.util.type(a)==="Array"?a:[a];for(var f=0;f<a.length;++f){var l=a[f],c=l.inside,h=!!l.lookbehind,p=0,d=l.alias;l=l.pattern||l;for(var v=0;v<s.length;v++){var m=s[v];if(s.length>e.length)break e;if(m instanceof i)continue;l.lastIndex=0;var g=l.exec(m);if(g){h&&(p=g[1].length);var y=g.index-1+p,g=g[0].slice(p),b=g.length,w=y+b,E=m.slice(0,y+1),S=m.slice(w+1),x=[v,1];E&&x.push(E);var T=new i(u,c?t.tokenize(g,c):g,d);x.push(T);S&&x.push(S);Array.prototype.splice.apply(s,x)}}}}return s},hooks:{all:{},add:function(e,n){var r=t.hooks.all;r[e]=r[e]||[];r[e].push(n)},run:function(e,n){var r=t.hooks.all[e];if(!r||!r.length)return;for(var i=0,s;s=r[i++];)s(n)}}},n=t.Token=function(e,t,n){this.type=e;this.content=t;this.alias=n};n.stringify=function(e,r,i){if(typeof e=="string")return e;if(Object.prototype.toString.call(e)=="[object Array]")return e.map(function(t){return n.stringify(t,r,e)}).join("");var s={type:e.type,content:n.stringify(e.content,r,i),tag:"span",classes:["token",e.type],attributes:{},language:r,parent:i};s.type=="comment"&&(s.attributes.spellcheck="true");if(e.alias){var o=t.util.type(e.alias)==="Array"?e.alias:[e.alias];Array.prototype.push.apply(s.classes,o)}t.hooks.run("wrap",s);var u="";for(var a in s.attributes)u+=a+'="'+(s.attributes[a]||"")+'"';return"<"+s.tag+' class="'+s.classes.join(" ")+'" '+u+">"+s.content+"</"+s.tag+">"};if(!self.document){if(!self.addEventListener)return self.Prism;self.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language,i=n.code;self.postMessage(JSON.stringify(t.util.encode(t.tokenize(i,t.languages[r]))));self.close()},!1);return self.Prism}var r=document.getElementsByTagName("script");r=r[r.length-1];if(r){t.filename=r.src;document.addEventListener&&!r.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)}return self.Prism}();typeof module!="undefined"&&module.exports&&(module.exports=Prism); </script> <script type="text/x-mathjax-config"> if (typeof MathJaxListener !== 'undefined') { MathJax.Hub.Register.StartupHook('End', function () { MathJaxListener.invokeCallbackForKey_('End'); }); } </script> <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> </body> </html>
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#5 | 18506 | C. Thomas Tyler | Released P4BBI/MultiArch/2016.2/18504 (2016/03/04). | ||
#4 | 18412 | C. Thomas Tyler | Released P4BBI. | ||
#3 | 15968 | C. Thomas Tyler |
Copy Up to main from dev using: p4 copy -r -b perforce-software-p4bbi-dev |
||
#2 | 11782 | C. Thomas Tyler | Corrected minor copy/paste typo. | ||
#1 | 11584 | C. Thomas Tyler | Added README for P4BBI. |