Documentaton

Artifact [e73c157dba]
Login

Artifact e73c157dbadc5302b10f4a59734118f505191ee688ba74f87923c971f306a528:


<!DOCTYPE html>

<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="mobile-web-app-capable" content="yes">
    <title>
        Fossil - CodiMD
    </title>
    <link rel="icon" type="image/png" href="https://docutopia.tupale.co/favicon.png">
    <link rel="apple-touch-icon" href="https://docutopia.tupale.co/apple-touch-icon.png">

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fork-awesome/1.1.3/css/fork-awesome.min.css" integrity="sha256-ZhApazu+kejqTYhMF+1DzNKjIzP7KXu6AzyXcC1gMus=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/themes/prism.min.css" integrity="sha256-vtR0hSWRc3Tb26iuN2oZHt3KRUomwTufNIf5/4oeCyg=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github-gist.min.css" integrity="sha256-tAflq+ymku3Khs+I/WcAneIlafYgDiOQ9stIHH985Wo=" crossorigin="anonymous" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
    <style>
        @import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600,600italic,300italic,300|Source+Serif+Pro|Source+Code+Pro:400,300,500&subset=latin,latin-ext);.markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body:after,.markdown-body:before{display:table;content:""}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#c00}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e7e7e7;border:0}.markdown-body blockquote{padding:0 1em;color:#777;border-left:.25em solid #ddd}.night .markdown-body blockquote{color:#bcbcbc}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body .loweralpha{list-style-type:lower-alpha}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.night .markdown-body h1,.night .markdown-body h2,.night .markdown-body h3,.night .markdown-body h4,.night .markdown-body h5,.night .markdown-body h6{color:#ddd}.markdown-body h1 .fa-link,.markdown-body h2 .fa-link,.markdown-body h3 .fa-link,.markdown-body h4 .fa-link,.markdown-body h5 .fa-link,.markdown-body h6 .fa-link{color:#000;vertical-align:middle;visibility:hidden;font-size:16px}.night .markdown-body h1 .fa-link,.night .markdown-body h2 .fa-link,.night .markdown-body h3 .fa-link,.night .markdown-body h4 .fa-link,.night .markdown-body h5 .fa-link,.night .markdown-body h6 .fa-link{color:#fff}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .fa-link,.markdown-body h2:hover .anchor .fa-link,.markdown-body h3:hover .anchor .fa-link,.markdown-body h4:hover .anchor .fa-link,.markdown-body h5:hover .anchor .fa-link,.markdown-body h6:hover .anchor .fa-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:1px solid #eee}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#777}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol.no-list,.markdown-body ul.no-list{padding:0;list-style-type:none}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}.markdown-body table th{font-weight:700}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #ddd}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc}.night .markdown-body table tr{background-color:#5f5f5f}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.night .markdown-body table tr:nth-child(2n){background-color:#4f4f4f}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em 0;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.night .markdown-body code,.night .markdown-body tt{color:#eee;background-color:hsla(0,0%,90.2%,.36)}.markdown-body code:after,.markdown-body code:before,.markdown-body tt:after,.markdown-body tt:before{letter-spacing:-.2em;content:"\A0"}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body pre code:after,.markdown-body pre code:before,.markdown-body pre tt:after,.markdown-body pre tt:before{content:normal}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-line-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:1px solid;border-color:#ccc #ccc #bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.news .alert .markdown-body blockquote{padding:0 0 0 40px;border:0}.activity-tab .news .alert .commits,.activity-tab .news .markdown-body blockquote{padding-left:0}.task-list-item{list-style-type:none}.task-list-item label{font-weight:400}.task-list-item.enabled label{cursor:pointer}.task-list-item+.task-list-item{margin-top:3px}.task-list-item-checkbox{float:left;margin:.31em 0 .2em -1.3em!important;vertical-align:middle;cursor:default!important}.markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;padding-top:40px;padding-bottom:40px;max-width:758px;overflow:visible!important}.markdown-body pre{border:inherit!important}.night .markdown-body pre{filter:invert(100%)}.markdown-body code{color:inherit!important}.markdown-body pre code .wrapper{display:-webkit-inline-flex;display:-moz-inline-flex;display:-ms-inline-flex;display:-o-inline-flex;display:inline-flex}.markdown-body pre code .gutter{float:left;overflow:hidden;-webkit-user-select:none;user-select:none}.markdown-body pre code .gutter.linenumber{text-align:right;position:relative;display:inline-block;cursor:default;z-index:4;padding:0 8px 0 0;min-width:20px;box-sizing:content-box;color:#afafaf!important;border-right:3px solid #6ce26c!important}.markdown-body pre code .gutter.linenumber>span:before{content:attr(data-linenumber)}.markdown-body pre code .code{float:left;margin:0 0 0 16px}.markdown-body .gist .line-numbers{border-left:none;border-top:none;border-bottom:none}.markdown-body .gist .line-data{border:none}.markdown-body .gist table{border-spacing:0;border-collapse:inherit!important}.night .markdown-body .gist table tr:nth-child(2n){background-color:#ddd}.markdown-body code[data-gist-id]{background:none;padding:0;filter:invert(100%)}.markdown-body code[data-gist-id]:after,.markdown-body code[data-gist-id]:before{content:""}.markdown-body code[data-gist-id] .blob-num{border:unset}.markdown-body code[data-gist-id] table{overflow:unset;margin-bottom:unset}.markdown-body code[data-gist-id] table tr{background:unset}.markdown-body[dir=rtl] pre{direction:ltr}.markdown-body[dir=rtl] code{direction:ltr;unicode-bidi:embed}.markdown-body .alert>p{margin-bottom:0}.markdown-body pre.abc,.markdown-body pre.flow-chart,.markdown-body pre.graphviz,.markdown-body pre.mermaid,.markdown-body pre.sequence-diagram{text-align:center;background-color:inherit;border-radius:0;white-space:inherit}.night .markdown-body pre.graphviz .graph>polygon{fill:#333}.night .markdown-body pre.mermaid .sectionTitle,.night .markdown-body pre.mermaid .titleText,.night .markdown-body pre.mermaid text{fill:#fff}.markdown-body pre.abc>code,.markdown-body pre.flow-chart>code,.markdown-body pre.graphviz>code,.markdown-body pre.mermaid>code,.markdown-body pre.sequence-diagram>code{text-align:left}.markdown-body pre.abc>svg,.markdown-body pre.flow-chart>svg,.markdown-body pre.graphviz>svg,.markdown-body pre.mermaid>svg,.markdown-body pre.sequence-diagram>svg{max-width:100%;height:100%}.night .markdown-body .abc path{fill:#eee}.night .markdown-body .abc path.note_selected{fill:##4DD0E1}.night tspan{fill:#fefefe}.night pre rect{fill:transparent}.night pre.flow-chart path,.night pre.flow-chart rect{stroke:#fff}.markdown-body pre>code.wrap{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}.markdown-body .alert>p,.markdown-body .alert>ul{margin-bottom:0}.markdown-body summary{display:list-item}.markdown-body summary:focus{outline:none}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>:not(summary){display:none}.markdown-body figure{margin:1em 40px}.markdown-body img{background-color:transparent}.vimeo,.youtube{cursor:pointer;display:table;text-align:center;background-position:50%;background-repeat:no-repeat;background-size:contain;background-color:#000;overflow:hidden}.vimeo,.youtube{position:relative;width:100%}.youtube{padding-bottom:56.25%}.vimeo img{width:100%;object-fit:contain;z-index:0}.youtube img{object-fit:cover;z-index:0}.vimeo iframe,.youtube iframe,.youtube img{width:100%;height:100%;position:absolute;top:0;left:0}.vimeo iframe,.youtube iframe{vertical-align:middle;z-index:1}.vimeo .icon,.youtube .icon{position:absolute;height:auto;width:auto;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;opacity:.3;-webkit-transition:opacity .2s;transition:opacity .2s;z-index:0}.vimeo:hover .icon,.youtube:hover .icon{opacity:.6;-webkit-transition:opacity .2s;transition:opacity .2s}.slideshare .inner,.speakerdeck .inner{position:relative;width:100%}.slideshare .inner iframe,.speakerdeck .inner iframe{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%}.MJX_Assistive_MathML{display:none}.ui-infobar{position:relative;z-index:2;max-width:758px;margin-top:25px;margin-bottom:-25px;color:#777}.toc .invisable-node{list-style-type:none}.ui-toc{position:fixed;bottom:20px;z-index:10000}.ui-toc-label{opacity:.3;background-color:#ccc;border:none}.ui-toc-label,.ui-toc .open .ui-toc-label{-webkit-transition:opacity .2s;transition:opacity .2s}.ui-toc .open .ui-toc-label{opacity:1;color:#fff}.ui-toc-label:focus{opacity:.3;background-color:#ccc;color:#000}.ui-toc-label:hover{opacity:1;background-color:#ccc;-webkit-transition:opacity .2s;transition:opacity .2s}.ui-toc-dropdown{margin-top:23px;margin-bottom:20px;padding-left:10px;padding-right:10px;max-width:45vw;width:25vw;max-height:70vh;overflow:auto;text-align:inherit}.ui-toc-dropdown>.toc{max-height:calc(70vh - 100px);overflow:auto}.ui-toc-dropdown[dir=rtl] .nav{padding-right:0;letter-spacing:.0029em}.ui-toc-dropdown a{overflow:hidden;text-overflow:ellipsis;white-space:pre}.ui-toc-dropdown .nav>li>a{display:block;padding:4px 20px;font-size:13px;font-weight:500;color:#767676}.ui-toc-dropdown .nav>li:first-child:last-child>ul,.ui-toc-dropdown .toc.expand ul{display:block}.ui-toc-dropdown .nav>li>a:focus,.ui-toc-dropdown .nav>li>a:hover{padding-left:19px;color:#000;text-decoration:none;background-color:transparent;border-left:1px solid #000}.night .ui-toc-dropdown .nav>li>a:focus,.night .ui-toc-dropdown .nav>li>a:hover{color:#fff;border-left-color:#fff}.ui-toc-dropdown[dir=rtl] .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav>li>a:hover{padding-right:19px;border-left:none;border-right:1px solid #000}.ui-toc-dropdown .nav>.active:focus>a,.ui-toc-dropdown .nav>.active:hover>a,.ui-toc-dropdown .nav>.active>a{padding-left:18px;font-weight:700;color:#000;background-color:transparent;border-left:2px solid #000}.night .ui-toc-dropdown .nav>.active:focus>a,.night .ui-toc-dropdown .nav>.active:hover>a,.night .ui-toc-dropdown .nav>.active>a{color:#fff;border-left:2px solid #fff}.ui-toc-dropdown[dir=rtl] .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav>.active>a{padding-right:18px;border-left:none;border-right:2px solid #000}.ui-toc-dropdown .nav .nav{display:none;padding-bottom:10px}.ui-toc-dropdown .nav>.active>ul{display:block}.ui-toc-dropdown .nav .nav>li>a{padding-top:1px;padding-bottom:1px;padding-left:30px;font-size:12px;font-weight:400}.night .ui-toc-dropdown .nav>li>a{color:#aaa}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a{padding-right:30px}.ui-toc-dropdown .nav .nav>li>ul>li>a{padding-top:1px;padding-bottom:1px;padding-left:40px;font-size:12px;font-weight:400}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a{padding-right:40px}.ui-toc-dropdown .nav .nav>li>a:focus,.ui-toc-dropdown .nav .nav>li>a:hover{padding-left:29px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:hover{padding-right:29px}.ui-toc-dropdown .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown .nav .nav>li>ul>li>a:hover{padding-left:39px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:hover{padding-right:39px}.ui-toc-dropdown .nav .nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>a{padding-left:28px;font-weight:500}.ui-toc-dropdown[dir=rtl] .nav .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>a{padding-right:28px}.ui-toc-dropdown .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active>a{padding-left:38px;font-weight:500}.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active>a{padding-right:38px}.markdown-body[lang^=ja]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,Hiragino Kaku Gothic Pro,"\30D2\30E9\30AE\30CE\89D2\30B4   Pro W3",Osaka,Meiryo,"\30E1\30A4\30EA\30AA",MS Gothic,"\FF2D\FF33   \30B4\30B7\30C3\30AF",sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.ui-toc-dropdown[lang^=ja]{font-family:Source Sans Pro,Helvetica,Arial,Meiryo UI,MS PGothic,"\FF2D\FF33   \FF30\30B4\30B7\30C3\30AF",sans-serif}.markdown-body[lang=zh-tw]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,PingFang TC,Microsoft JhengHei,"\5FAE\8EDF\6B63\9ED1",sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.ui-toc-dropdown[lang=zh-tw]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft JhengHei UI,"\5FAE\8EDF\6B63\9ED1UI",sans-serif}.markdown-body[lang=zh-cn]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,PingFang SC,Microsoft YaHei,"\5FAE\8F6F\96C5\9ED1",sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.ui-toc-dropdown[lang=zh-cn]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft YaHei UI,"\5FAE\8F6F\96C5\9ED1UI",sans-serif}.ui-affix-toc{position:fixed;top:0;max-width:15vw;max-height:70vh;overflow:auto}.back-to-top,.expand-toggle,.go-to-bottom{display:block;padding:4px 10px;margin-top:10px;margin-left:10px;font-size:12px;font-weight:500;color:#999}.back-to-top:focus,.back-to-top:hover,.expand-toggle:focus,.expand-toggle:hover,.go-to-bottom:focus,.go-to-bottom:hover{color:#563d7c;text-decoration:none}.back-to-top,.go-to-bottom{margin-top:0}.ui-user-icon{width:20px;height:20px;display:block;border-radius:3px;margin-top:2px;margin-bottom:2px;margin-right:5px;background-position:50%;background-repeat:no-repeat;background-size:contain}.ui-user-icon.small{width:18px;height:18px;display:inline-block;vertical-align:middle;margin:0 0 .2em}small span{line-height:22px}small .dropdown{display:inline-block}small .dropdown a:focus,small .dropdown a:hover{text-decoration:none}.unselectable{-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;user-select:none}.night .navbar{background:#333;border-bottom-color:#333;color:#eee}.night .navbar a{color:#eee}@media print{blockquote,div,img,pre,table{page-break-inside:avoid!important}a[href]:after{font-size:12px!important}}.markdown-body.slides{position:relative;z-index:1;color:#222}.markdown-body.slides:before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1;background-color:currentColor;box-shadow:0 0 0 50vw}.markdown-body.slides section[data-markdown]{position:relative;margin-bottom:1.5em;background-color:#fff;text-align:center}.markdown-body.slides section[data-markdown] code{text-align:left}.markdown-body.slides section[data-markdown]:before{content:"";display:block;padding-bottom:56.23%}.markdown-body.slides section[data-markdown]>div:first-child{position:absolute;top:50%;left:1em;right:1em;transform:translateY(-50%);max-height:100%;overflow:hidden}.markdown-body.slides section[data-markdown]>ul{display:inline-block}.markdown-body.slides>section>section+section:after{content:"";position:absolute;top:-1.5em;right:1em;height:1.5em;border:3px solid #777}body{font-smoothing:subpixel-antialiased!important;-webkit-font-smoothing:subpixel-antialiased!important;-moz-osx-font-smoothing:auto!important;text-shadow:0 0 1em transparent,1px 1px 1.2px rgba(0,0,0,.004);-webkit-overflow-scrolling:touch;font-family:Source Sans Pro,Helvetica,Arial,sans-serif;letter-spacing:.025em}.focus,:focus{outline:none!important}::-moz-focus-inner{border:0!important}body.modal-open{overflow-y:auto;padding-right:0!important}
    </style>
    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js" integrity="sha256-3Jy/GbSLrg0o9y5Z5n1uw0qxZECH7C6OQpVBgNFYa0g=" crossorigin="anonymous"></script>
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js" integrity="sha256-g6iAfvZp+nDQ2TdTR/VVKJf3bGro4ub5fvWSWVRi2NE=" crossorigin="anonymous"></script>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.9/es5-shim.min.js" integrity="sha256-8E4Is26QH0bD52WoQpcB+R/tcWQtpzlCojrybUd7Mxo=" crossorigin="anonymous"></script>
    <![endif]-->
</head>

<body>
    <div id="doc" class="markdown-body container-fluid"><h1 id="Fossil"><a class="anchor hidden-xs" href="#Fossil" title="Fossil"><i class="fa fa-link"></i></a>Fossil</h1><div class="alert alert-success">
<ul>
<li><strong>Propósito</strong>: Introducir los sistemas de control de versiones, en especial, Fossil.</li>
<li><strong>Ejercicio práctico</strong>: Clonar un repositorio en Fossil, registrarse en él, sincronizarse
y agregar nuevo contenido, hecho en Markdown.</li>
<li><strong>Prerequisitos</strong>:
<ul>
<li><strong>Lección</strong>: <a href="./markdown" target="_blank" rel="noopener">Markdown</a>.</li>
</ul>
</li>
</ul>
</div><p>Fossil es un sistema de colaboración distribuido para gestión de código fuente.
Los SCM (Software Configuration Management) o DVCS (Distributed Version Control System)
resuelven el problema respecto a cómo reproduzco el estado de un sistema
de cómputo y su historia (orientado a archivos).
Al resolver esta inquietud, se está resolviendo una pregunta incidental que
es sobre cómo colaborar, de maneras no centralizadas.</p><p>Fossil es el SCM elegido para trabajar con <a href="http://mutabit.com/grafoscopio/" target="_blank" rel="noopener">Grafoscopio</a> y el Data Week
por su caracter sencillo y autocontenido, lo cual quiere decir que brinda
mucha funcionalidad en un único programa, con flujos de trabajo y colaboración simples,
y puede ejecutarse en una variedad grande de plataformas de hardware y software, con
mínimos requerimientos de recursos de hardware (poca memoria RAM, menos de 3 Mb en
disco duro) y software, además tanto los datos como los metadatos (salvo las contraseñas)
son repartidos entre todos los usuarios que se sincronicen al repositorio, es decir,
satisface nuestra definición de <a href="./infraestructuras-de-bolsillo.md" target="_blank" rel="noopener">infraestructuras de bolsillo</a>.</p><p>Existen algunas pocas herramientas para Git, como <a href="https://gogs.io/" target="_blank" rel="noopener">Gogs</a>,
que siguen el enfoque minimalista de Fossil, si bien no toda la información
parece ser autocontenida e implican los flujos de trabajo complicados propios
de Git.</p><p><strong>Referencias Extra:</strong></p><ul>
<li><a href="http://fossil-scm.org/" target="_blank" rel="noopener">Página principal de Fossil</a>.
<ul>
<li>Son habituales las discusiones y comparaciones de Fossil contra los sistemas
más populares, particularmente Git, así que acá algunos enlaces (de documentos en
Inglés) que te ayudarán a tener una perspectiva informada, para defender el uso de
Fossil vs Git, o para saber cuándo usar cuál:
<ul>
<li><a href="https://www.fossil-scm.org/xfer/doc/trunk/www/whyusefossil.wiki" target="_blank" rel="noopener">Why You Should Use Fossil</a>.</li>
<li><a href="https://www.fossil-scm.org/xfer/doc/trunk/www/webui.wiki" target="_blank" rel="noopener">The Fossil Web Interface</a>: Muestra varias de las
características que Fossil integra desde su interfaz web.
Veremos algunas de ellas en este mismo documento.</li>
<li><a href="https://www.fossil-scm.org/xfer/doc/trunk/www/qandc.wiki" target="_blank" rel="noopener">Preguntas y críticas</a>.</li>
<li><a href="https://www.fossil-scm.org/xfer/doc/trunk/www/fossil-v-git.wiki" target="_blank" rel="noopener">Fossil vs Git</a>.</li>
<li><a href="http://fossil-scm.org/index.html/doc/trunk/www/quotes.wiki" target="_blank" rel="noopener">Citas: Lo que la gente está diciendo</a>.</li>
<li><a href="http://fossil-scm.org/index.html/doc/trunk/www/reviews.wiki" target="_blank" rel="noopener">Evaluaciones</a>.</li>
</ul>
</li>
<li><a href="https://www.fossil-scm.org/xfer/doc/trunk/www/embeddeddoc.wiki" target="_blank" rel="noopener">Documentación embebida para proyectos</a>: Esta es
la forma de documentación que empleamos para el Data Week y Grafoscopio.
Explica cómo usarla y cómo acceder a la última versión de un documento, o
la que habrá de enviarse al repositorio, o la de alguna fecha o <em>commit</em>
específicos.
<ul>
<li><a href="../md_rules" target="_blank" rel="noopener">Reglas de Markdown usadas por Fossil</a>.</li>
</ul>
</li>
<li><a href="https://www.fossil-scm.org/schimpf-book/home" target="_blank" rel="noopener">Fossil User Manual</a>: Un texto
detallado y con ejemplos sobre cómo usar Fossil en proyectos colaborativos.
Si bien corresponde a una versión antigua de Fossil, las lógicas de uso y muchas
de las interfaces siguen siendo utilizables hoy en día.</li>
</ul>
</li>
<li><a href="https://stackoverflow.com/questions/30577090/how-to-export-fossil-scm-timeline-to-another-format" target="_blank" rel="noopener">Compilando Fossil con soporte para JSON</a>.</li>
<li>Clay Shirky: <a href="https://www.ted.com/talks/clay_shirky_how_the_internet_will_one_day_transform_government" target="_blank" rel="noopener">How someday Internet will one day transform the government</a>:
Una presentación, más bien simplista, sobre cómo estas tecnologías tipo Git y fossil
podrían cambiar prácticas de poder, participación y democracía.</li>
</ul><h2 id="Instalación"><a class="anchor hidden-xs" href="#Instalación" title="Instalación"><i class="fa fa-link"></i></a>Instalación</h2><p>Antes de proceder a la instalación es conveniente verificar si ya se tiene
instalado fossil (por ejemplo verificar si el comando “fossil” existe
tecleando <code>$ which fossil</code>).</p><h3 id="En-GnuLinux"><a class="anchor hidden-xs" href="#En-GnuLinux" title="En-GnuLinux"><i class="fa fa-link"></i></a>En Gnu/Linux</h3><p>Averigua con el gestor de paquetes (apt, pacman) si tu distribución de Linux tiene
Fossil disponible en una <a href="https://www.fossil-scm.org/index.html/uv/download.html" target="_blank" rel="noopener">versión relativamente reciente</a> (como
las que usamos para nuestros talleres) e instálada desde dicho gestor.</p><div class="alert alert-warning">
<p>En nuestra experiencia, algunas distribuciones derivadas de Debian,
suelen tener paquetes muy viejos de Fossil.</p>
</div><h3 id="Usando-gestoresinstaladores-de-software"><a class="anchor hidden-xs" href="#Usando-gestoresinstaladores-de-software" title="Usando-gestoresinstaladores-de-software"><i class="fa fa-link"></i></a>Usando gestores/instaladores de software</h3><p>Más información <a href="./instaladores-gestores-software" target="_blank" rel="noopener">acá</a></p><h3 id="Windows"><a class="anchor hidden-xs" href="#Windows" title="Windows"><i class="fa fa-link"></i></a>Windows</h3><h4 id="Con-Scoop"><a class="anchor hidden-xs" href="#Con-Scoop" title="Con-Scoop"><i class="fa fa-link"></i></a>Con Scoop</h4><div class="alert alert-info">
<p><strong>Importante:</strong> Para hacer estar parte debes haber <a href="./instaladores-gestores-software#Scoop" target="_blank" rel="noopener">instalado previamente Scoop</a>.</p>
</div><p>Abrimos Power Shell y escribimos:</p><pre><code>  scoop install fossil
</code></pre><p>Al ejecutarlo, debemos ver algo como esto:</p><pre><code>Installing 'fossil' (2.8) [32bit]
fossil-w32-2.8.zip (2.1 MB) [=================================================================================] 100%
Checking hash of fossil-w32-2.8.zip ... ok.
Extracting fossil-w32-2.8.zip ... done.
Linking ~\scoop\apps\fossil\current =&gt; ~\scoop\apps\fossil\2.8
Creating shim for 'fossil'.
'fossil' (2.8) was installed successfully!
</code></pre><h4 id="Métodos-de-instalación-alternativos"><a class="anchor hidden-xs" href="#Métodos-de-instalación-alternativos" title="Métodos-de-instalación-alternativos"><i class="fa fa-link"></i></a>Métodos de instalación alternativos</h4><p>Se puede instalar desde el gestor de paquetes en Linux, Mac, Windows, pero cuando está muy desactualizado,
una alternativa es instalarlo desde el código fuente.</p><ul>
<li>Entramos a la <a href="http://fossil-scm.org/index.html/uv/download.html" target="_blank" rel="noopener">página de descargas de Fossil</a>
y allí bajamos la última versión disponible para Windows.</li>
<li>Una vez hallamos descompreso el archivo descargado, nos mostrará los contenidos
del archivo zip, con un único elemento que es el archivo <code>fossil.exe</code>.</li>
<li>Copiamos el archivo <code>fossil.exe</code> dentro del zip descargado y lo pegamos a la
carpeta <code>C:Windows\</code>.</li>
<li>Abrimos la consola de comandos en Windows y escribimos <code>fossil</code> en ella.
Debe aparecer algo como:</li>
</ul><h4 id="GnuLinux-y-Mac"><a class="anchor hidden-xs" href="#GnuLinux-y-Mac" title="GnuLinux-y-Mac"><i class="fa fa-link"></i></a>Gnu/Linux y Mac</h4><p>Así se hace esto en Gnu/Linux y Mac, usando comandos en la terminal:</p><ol>
<li>
<p>Descargar el instalador desde la página web:</p>
<pre><code> cd /tmp
 wget http://fossil-scm.org/index.html/uv/fossil-linux-x64-2.3.tar.gz
</code></pre>
</li>
<li>
<p>Descomprimimos el archivo:</p>
<pre><code> tar xvfz fossil-linux-x64-2.3.tar.gz
</code></pre>
</li>
<li>
<p>Encontraremos un binario llamado <code>fossil</code> que copiamos a donde están todos los binarios:</p>
<pre><code> sudo cp fossil /usr/bin
</code></pre>
</li>
</ol><h2 id="Usando-Fossil"><a class="anchor hidden-xs" href="#Usando-Fossil" title="Usando-Fossil"><i class="fa fa-link"></i></a>Usando Fossil</h2><p>Para usar Fossil, vamos a sincronizarnos contra un repositorio, agregar archivos
a este y mirar cómo ha cambiado su línea de tiempo.
Hay otras cuestiones que vamos a dejar en el radar, pero que no vamos a profundizar,
como el hecho de publicar repositorios propios.
Sin embargo, ese tipo de funcionalidad también está provista por sistemas como
<a href="http://chiselapp.com/" target="_blank" rel="noopener">Chisel</a>.</p><h3 id="Navegar-un-repositorio"><a class="anchor hidden-xs" href="#Navegar-un-repositorio" title="Navegar-un-repositorio"><i class="fa fa-link"></i></a>Navegar un repositorio:</h3><p>Existen determinados lugares para visitar con los cuales uno se puede
hacer una idea de un repositorio de Fossil, sus contenidos y actividad.
A continuación los listamos esos lugares, mostrando algunos ejemplos de
los mismos en distintos repositorios.</p><ul>
<li>Portada:
<ul>
<li>Para Grafoscopio: <a href="http://mutabit.com/repos.fossil/grafoscopio/" target="_blank" rel="noopener">http://mutabit.com/repos.fossil/grafoscopio/</a></li>
<li>Para el Data Week: <a href="http://mutabit.com/repos.fossil/dataweek" target="_blank" rel="noopener">http://mutabit.com/repos.fossil/dataweek</a><br>
(es la misma que está acortada en <a href="http://is.gd/oddbog" target="_blank" rel="noopener">http://is.gd/oddbog</a> )</li>
</ul>
</li>
<li>La línea de tiempo:
<ul>
<li>Data Week:
<ul>
<li>Por omisión: <a href="http://mutabit.com/repos.fossil/dataweek/timeline" target="_blank" rel="noopener">http://mutabit.com/repos.fossil/dataweek/timeline</a></li>
<li>Los últimos 500 “commits”: <a href="http://mutabit.com/repos.fossil/dataweek/timeline?n=500&amp;y=all&amp;t=&amp;ms=exact" target="_blank" rel="noopener">http://mutabit.com/repos.fossil/dataweek/timeline?n=500&amp;y=all&amp;t=&amp;ms=exact</a></li>
</ul>
</li>
</ul>
</li>
<li>Los contenidos (archivos o carpetas):
<ul>
<li>Para el Data Week: <a href="http://mutabit.com/repos.fossil/dataweek/dir" target="_blank" rel="noopener">http://mutabit.com/repos.fossil/dataweek/dir</a></li>
</ul>
</li>
<li>Los “tickets” (solicitudes, peticiones, asuntos):
<ul>
<li>De Grafoscopio: <a href="http://mutabit.com/repos.fossil/grafoscopio/rptview?rn=1" target="_blank" rel="noopener">http://mutabit.com/repos.fossil/grafoscopio/rptview?rn=1</a></li>
</ul>
</li>
</ul><h3 id="Clonar-un-repositorio"><a class="anchor hidden-xs" href="#Clonar-un-repositorio" title="Clonar-un-repositorio"><i class="fa fa-link"></i></a>Clonar un repositorio:</h3><div class="alert alert-warning">
<p><strong>ADVERTENCIA</strong>: asegurarse que los comandos se ejecutan en el directorio correcto
porque se pueden crear un montón de directorios y cosas en un directorio que no se desea.</p>
</div><p>Cuando se descarga un repositorio lo que se hace es traer toda la historia del mismo
de su lugar remoto a mi disco duro.
Vamos a hacer esto con el repositorio de la Documentanton, desde la consola de comandos.</p><ul>
<li>
<p>Creamos una carpeta para el repositorio del proyecto actual. Para Mac:</p>
<p><code>mkdir ~/Documentos/&lt;nombre_repositorio&gt;</code></p>
</li>
<li>
<p>Para Windows, ingresar a la linea de comandos (cmd):</p>
<p><code>md ~/Documentos/&lt;nombre_repositorio&gt;</code></p>
</li>
</ul><p>Donde <em>&lt;nombre_repositorio</em>&gt; es el nombre de la carpeta a descargar (repositorio).</p><ul>
<li>
<p>Nos ubicamos en esa carpeta creada:</p>
<p><code>cd ~/Documentos/&lt;nombre_repositorio&gt;</code></p>
</li>
<li>
<p>Clonamos el repositorio:</p>
<p><code>fossil clone http://mutabit.com/repos.fossil/&lt;nombre_repositorio&gt;/ &lt;nombre_repositorio&gt;.fossil</code></p>
<p>Al final de proceso deberá aparecer algo similar a:</p>
<pre><code class="bash hljs"><div class="wrapper"><div class="gutter linenumber"><span data-linenumber="1"></span>
<span data-linenumber="2"></span>
<span data-linenumber="3"></span>
<span data-linenumber="4"></span></div><div class="code">    project-id: aa9f6e73b4f326e190f15c4a830c0909619bfa42
    server-id:  1f91261cb649d68c08dc75f7609975b787bc754f
    admin-user: Pibi (password is <span class="hljs-string">"acead4"</span>)
   
</div></div></code></pre>
</li>
<li>
<p>Abrimos el repositorio:</p>
<p><code>fossil open &lt;nombre_repositorio&gt;.fossil</code></p>
<p>y se deben ver los mismos <a href="http://mutabit.com/repos.fossil/%3Cnombre_repositorio%3E/dir?ci=tip" target="_blank" rel="noopener">contenidos del repositorio remoto</a>
en nuestro disco duro local. Debera aparecer algo similar a:</p>
<pre><code class="bash hljs"><div class="wrapper"><div class="gutter linenumber"><span data-linenumber="1"></span>
<span data-linenumber="2"></span>
<span data-linenumber="3"></span>
<span data-linenumber="4"></span>
<span data-linenumber="5"></span>
<span data-linenumber="6"></span>
<span data-linenumber="7"></span>
<span data-linenumber="8"></span>
<span data-linenumber="9"></span></div><div class="code">    project-name: Documentaton
    repository:   D:/documentaton/documentaton.fossil
    <span class="hljs-built_in">local</span>-root:   D:/documentaton/
    config-db:    C:/Users/palza/AppData/Local/_fossil
    project-code: ac6959a5354c5b489888aa795e38efab1fdac313
    checkout:     696a19768f970fb89a660e0ec6ffcbf5219eb205 2019-03-10 00:23:10 UTC
    tags:         trunk
    comment:      initial empty check-in (user: offray)
    check-ins:    1
</div></div></code></pre>
</li>
</ul><h2 id="Modificar-el-repositorio"><a class="anchor hidden-xs" href="#Modificar-el-repositorio" title="Modificar-el-repositorio"><i class="fa fa-link"></i></a>Modificar el repositorio</h2><p>Vamos a crear un archivo en una subcarpeta dentro de la carpeta de idiomas, que contiene un de los capítulos del librillo.</p><ul>
<li>
<p>Crear la carpeta propia:</p>
<p><code>mkdir -p es/capitulos</code></p>
</li>
<li>
<p>Descargamos un archivo de Markdown (digamos <a href="https://docutopia.tupale.co/documentaton:presentacion#" target="_blank" rel="noopener">la presentación</a>) y lo salvamos con un nombre corto (digamos <code>presentacion.md</code>) dentro de esa carpeta.</p>
</li>
<li>
<p>Agregamos ese archivo a ese repositorio</p>
<pre><code class="bash hljs"><div class="wrapper"><div class="gutter linenumber"><span data-linenumber="1"></span></div><div class="code">  fossil add es/capitulos/presentacion.md
</div></div></code></pre>
<p><strong>Nota</strong>: Recuerda que Los símbolos <code>&lt;</code> y <code>&gt;</code> no se incluyen</p>
<p>La respuesta debería ser algo como</p>
<pre><code class="bash hljs"><div class="wrapper"><div class="gutter linenumber"><span data-linenumber="1"></span></div><div class="code">  ADDED es/capitulos/presentacion.md
</div></div></code></pre>
</li>
<li>
<p><strong>Realizamos una actualización al repositorio</strong> (en caso de que hayan habido cambios por otros mientras realizábamos los nuestros) y hacemos nuestro primer commit, con un mensaje descriptivo:</p>
<pre><code class="bash hljs"><div class="wrapper"><div class="gutter linenumber"><span data-linenumber="1"></span>
<span data-linenumber="2"></span></div><div class="code">    fossil update
    fossil commit -m <span class="hljs-string">"&lt;comentario corto descriptivo&gt;."</span>
</div></div></code></pre>
<p>Puede que recibamos mensajes sobre que no podemos autosincronizar.
Por lo pronto no haremos caso de ellos.</p>
<p>Para ver lo que ocurre en el repositorio escribimos <code>fossil ui</code>,
que despliega la interfaz gráfica de usuario en nuestra máquina.
(Esto ocurre en menos de 3 Mb!).
Debemos ver algo cómo:</p>
</li>
</ul><h2 id="Sincronización-entre-repositorios"><a class="anchor hidden-xs" href="#Sincronización-entre-repositorios" title="Sincronización-entre-repositorios"><i class="fa fa-link"></i></a>Sincronización entre repositorios</h2><p>Dicha sincronización es hecha a través de un servidor que sirve como coordinador.
En nuestro caso, será el repositorio original del Data Week.
Lo anterior quiere decir que debemos registrarnos en dicho repositorio y solicitar
permisos para sincronizarnos con él.</p><ul>
<li>Entramos a la <a href="http://mutabit.com/repos.fossil/dataweek/login" target="_blank" rel="noopener">página de ingreso (login)</a>,
específicamente a la <a href="http://mutabit.com/repos.fossil/dataweek/register?g=" target="_blank" rel="noopener">página de registro </a>.
Veremos algo como esto:</li>
</ul><figure><a href="https://screenshotscdn.firefoxusercontent.com/images/abee55f8-f0de-445a-8284-6c1404da1f89.png" target="_blank" rel="noopener">
      <img src="https://screenshotscdn.firefoxusercontent.com/images/abee55f8-f0de-445a-8284-6c1404da1f89.png" style="width:85%" alt="Pantalla de registro de Fossil.">
    </a>
    <figcaption><small><b>^Arriba |</b>
         Pantalla de registro de Fossil.
      </small>
    </figcaption>
  </figure><ul>
<li>
<p>Configurar usuario de fossil
Esto se debe hacer si el usuario del sistema local (del pc) no es el mismo que se creó en el login del paso
anterior.  Fossil por defecto toma el nombre de usuario del sistema local (del PC).</p>
<ul>
<li>
<p>Crear usuario nuevo en fossil local</p>
<pre><code>`fossil user new &lt;usuario&gt;`
</code></pre>
</li>
<li>
<p>Ponerlo como usuario por defecto</p>
<pre><code>`fossil user default &lt;usuario&gt;`
</code></pre>
</li>
</ul>
</li>
</ul><p>Donde &lt;usuario&gt; es el usuario que creamos en el paso anterior del “login” (sin los símbolos <code>&lt;</code> <code>&gt;</code>).</p><ul>
<li>
<p>Sincronización: dentro del repositorio hacemos:
Hacer un update primero (pues probablemente hay cambios nuevos que no se tienen):
fossil update</p>
<p><code>fossil sync http://&lt;usuario&gt;@mutabit.com/repos.fossil/&lt;nombre_repositorio&gt;/</code></p>
<p>donde &lt;usuario&gt; es el nombre del usuario con el que nos registramos en Fossil y &lt;nombre_repositorio&gt; es el nombre del repositorio (carpeta descargada)</p>
</li>
</ul><div class="alert alert-success">
<p>En caso de que la actualización falle, es probable que hayas realizado una sincronización con un usuario incorrecto, verifica el usuario con que estas sincronizando, recuerda que fossil es sencible a minusculas y mayusculas.</p>
</div><p>Deberas tener una respuesta como esta:</p><pre><code>Round-trips: 2   Artifacts sent: 0  received: 4
Sync done, sent: 1123  received: 3782  ip: 45.55.37.99
</code></pre><h2 id="Cómo-resolver-las-bifurcaciones-involutarias-forks"><a class="anchor hidden-xs" href="#Cómo-resolver-las-bifurcaciones-involutarias-forks" title="Cómo-resolver-las-bifurcaciones-involutarias-forks"><i class="fa fa-link"></i></a>Cómo resolver las bifurcaciones involutarias (forks).</h2><p>La diferencia entre “branches” y “forks”:</p><ul>
<li><a href="http://fossil-scm.org/index.html/doc/trunk/www/faq.wiki#q2" target="_blank" rel="noopener">What is the difference between a “branch” and a “fork”?</a>.</li>
<li><a href="http://fossil-scm.org/index.html/doc/trunk/www/branching.wiki" target="_blank" rel="noopener">Branching, Forking, Merging, and Tagging Login</a>.</li>
</ul><p>El estado del <a href="http://mutabit.com/repos.fossil/dataweek/timeline" target="_blank" rel="noopener">repositorio</a> a hoy era este:</p><figure><a href="https://screenshotscdn.firefoxusercontent.com/images/f9f02c3f-ad09-4d04-88ab-4681eaf66892.png" target="_blank" rel="noopener">
    <img src="https://screenshotscdn.firefoxusercontent.com/images/f9f02c3f-ad09-4d04-88ab-4681eaf66892.png" style="width:85%" alt="Repositorio antes del merge.">
  </a>
  <figcaption><small><b>^Up |</b>
       Repositorio antes del merge.
    </small>
  </figcaption>
</figure><p>Vemos que se han integrado dos bifurcaciones, pero aún quedan tres por integrar.
Cada estado del sistema está descrito por un código alfanumérico único, <a href="https://en.wikipedia.org/wiki/Checksum" target="_blank" rel="noopener">suma hash</a>.</p><p>Las ramas que fueron integradas corresponden (en la imagen) a las siguientes sumas hash:
<code>[f0ea5717e4]</code> (El commit de Grace) y el tronco (trunk) de ese momento, cuyo <em>checksum</em>
corresponde a <code>[1b5023d5a4]</code>, produciendo un estado del sistema nuevo, cuyo <em>checksum</em>
es <code>[dcd4e53045]</code>.</p><p>Vamos a integrar una nueva ramificación en el tronco principal.
Para ello, ubicados en el repositorio, desde la terminal</p><pre><code>fossil update trunk
fossil merge 0ef40cd985
</code></pre><p>Aparecerá algo como esto:</p><pre><code>Autosync:  http://offray@mutabit.com/repos.fossil/&lt;nombre_repositorio&gt;/
Round-trips: 1   Artifacts sent: 0  received: 0
Pull done, sent: 383  received: 2429  ip: 45.55.37.99
ADDED Participantes/Ivan/intro.md
 "fossil undo" is available to undo changes to the working checkout.
WARNING: multiple open leaf check-ins on trunk:                                                   
  (1) 2018-02-24 18:59:24 [dcd4e53045] (current)
  (2) 2018-02-24 01:33:03 [5da6cdb6dc]
  (3) 2018-02-24 01:32:45 [0a25a7636d]
  (4) 2018-02-24 01:31:51 [0ef40cd985]
</code></pre><p>Luego hacemos un commit al repositorio:</p><pre><code>fossil commit -m "Integrando cambios de Iván."
</code></pre><p>Y luego mezclamos ese commit con el tronco principal, que de ahora en adelante llamaremos
simplemente “trunk”.
Veremos algo como esto:</p><figure><a href="https://screenshotscdn.firefoxusercontent.com/images/25d6dd2f-c719-45f8-a0af-730f2ce8a8cc.png" target="_blank" rel="noopener">
    <img src="https://screenshotscdn.firefoxusercontent.com/images/25d6dd2f-c719-45f8-a0af-730f2ce8a8cc.png" style="width:85%" alt="Repositorio después del merge.">
  </a>
  <figcaption><small><b>^Up |</b>
       Repositorio después del merge.
   </small>
  </figcaption>
</figure><p><strong>NOTA:</strong> Si olvidas hacer el <code>fossil update trunk</code> antes de hacer el merge, puedes usar <code>fossil undo</code> para revertir el cambio.</p><h2 id="Varios"><a class="anchor hidden-xs" href="#Varios" title="Varios"><i class="fa fa-link"></i></a>Varios:</h2><ul>
<li>
<p><strong>¿Cómo saber la URL del repositorio?</strong></p>
<p>Tiene que ser dada por el “proveedor” del repositorio.</p>
</li>
<li>
<p><strong>¿Qué quiere decir cuando aparece “Fossil internal error: repository doesn’t not exist …
mapeda.fosil”?</strong></p>
<p>Que se está intentando abrir un repositorio sin estar ubicado en la carpeta donde se clonó,
o que se está intentando clonar en la carpeta de otro repositorio, sin haberlo cerrado previamente</p>
</li>
<li>
<p>Ayuda en fossil:  <code>fossil help COMMAND</code> (con <code>fossil help</code> da la lista de
posibles comandos )</p>
</li>
</ul><p>[<a href="./indice-tematico" target="_blank" rel="noopener">Indice</a>] [&lt; <a href="./markdown" target="_blank" rel="noopener">Markdown</a>] [<a href="./grafoscopio" target="_blank" rel="noopener">Grafoscopio</a> &gt;]</p></div>
    <div class="ui-toc dropup unselectable hidden-print" style="display:none;">
        <div class="pull-right dropdown">
            <a id="tocLabel" class="ui-toc-label btn btn-default" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false" title="Table of content">
                <i class="fa fa-bars"></i>
            </a>
            <ul id="ui-toc" class="ui-toc-dropdown dropdown-menu" aria-labelledby="tocLabel">
                <div class="toc"><ul class="nav">
<li class=""><a href="#Fossil" title="Fossil">Fossil</a><ul class="nav">
<li><a href="#Instalación" title="Instalación">Instalación</a><ul class="nav">
<li><a href="#En-GnuLinux" title="En Gnu/Linux">En Gnu/Linux</a></li>
<li><a href="#Usando-gestoresinstaladores-de-software" title="Usando gestores/instaladores de software">Usando gestores/instaladores de software</a></li>
<li><a href="#Windows" title="Windows">Windows</a></li>
</ul>
</li>
<li><a href="#Usando-Fossil" title="Usando Fossil">Usando Fossil</a><ul class="nav">
<li><a href="#Navegar-un-repositorio" title="Navegar un repositorio:">Navegar un repositorio:</a></li>
<li><a href="#Clonar-un-repositorio" title="Clonar un repositorio:">Clonar un repositorio:</a></li>
</ul>
</li>
<li><a href="#Modificar-el-repositorio" title="Modificar el repositorio">Modificar el repositorio</a></li>
<li><a href="#Sincronización-entre-repositorios" title="Sincronización entre repositorios">Sincronización entre repositorios</a></li>
<li><a href="#Cómo-resolver-las-bifurcaciones-involutarias-forks" title="Cómo resolver las bifurcaciones involutarias (forks).">Cómo resolver las bifurcaciones involutarias (forks).</a></li>
<li><a href="#Varios" title="Varios:">Varios:</a></li>
</ul>
</li>
</ul>
</div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div>
            </ul>
        </div>
    </div>
    <div id="ui-toc-affix" class="ui-affix-toc ui-toc-dropdown unselectable hidden-print" data-spy="affix" style="top:17px;display:none;"  >
        <div class="toc"><ul class="nav">
<li class=""><a href="#Fossil" title="Fossil">Fossil</a><ul class="nav">
<li><a href="#Instalación" title="Instalación">Instalación</a><ul class="nav">
<li><a href="#En-GnuLinux" title="En Gnu/Linux">En Gnu/Linux</a></li>
<li><a href="#Usando-gestoresinstaladores-de-software" title="Usando gestores/instaladores de software">Usando gestores/instaladores de software</a></li>
<li><a href="#Windows" title="Windows">Windows</a></li>
</ul>
</li>
<li><a href="#Usando-Fossil" title="Usando Fossil">Usando Fossil</a><ul class="nav">
<li><a href="#Navegar-un-repositorio" title="Navegar un repositorio:">Navegar un repositorio:</a></li>
<li><a href="#Clonar-un-repositorio" title="Clonar un repositorio:">Clonar un repositorio:</a></li>
</ul>
</li>
<li><a href="#Modificar-el-repositorio" title="Modificar el repositorio">Modificar el repositorio</a></li>
<li><a href="#Sincronización-entre-repositorios" title="Sincronización entre repositorios">Sincronización entre repositorios</a></li>
<li><a href="#Cómo-resolver-las-bifurcaciones-involutarias-forks" title="Cómo resolver las bifurcaciones involutarias (forks).">Cómo resolver las bifurcaciones involutarias (forks).</a></li>
<li><a href="#Varios" title="Varios:">Varios:</a></li>
</ul>
</li>
</ul>
</div><div class="toc-menu"><a class="expand-toggle" href="#">Expand all</a><a class="back-to-top" href="#">Back to top</a><a class="go-to-bottom" href="#">Go to bottom</a></div>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous" defer></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
    <script>
        var markdown = $(".markdown-body");
        //smooth all hash trigger scrolling
        function smoothHashScroll() {
            var hashElements = $("a[href^='#']").toArray();
            for (var i = 0; i < hashElements.length; i++) {
                var element = hashElements[i];
                var $element = $(element);
                var hash = element.hash;
                if (hash) {
                    $element.on('click', function (e) {
                        // store hash
                        var hash = this.hash;
                        if ($(hash).length <= 0) return;
                        // prevent default anchor click behavior
                        e.preventDefault();
                        // animate
                        $('body, html').stop(true, true).animate({
                            scrollTop: $(hash).offset().top
                        }, 100, "linear", function () {
                            // when done, add hash to url
                            // (default click behaviour)
                            window.location.hash = hash;
                        });
                    });
                }
            }
        }

        smoothHashScroll();
        var toc = $('.ui-toc');
        var tocAffix = $('.ui-affix-toc');
        var tocDropdown = $('.ui-toc-dropdown');
        //toc
        tocDropdown.click(function (e) {
            e.stopPropagation();
        });

        var enoughForAffixToc = true;

        function generateScrollspy() {
            $(document.body).scrollspy({
                target: ''
            });
            $(document.body).scrollspy('refresh');
            if (enoughForAffixToc) {
                toc.hide();
                tocAffix.show();
            } else {
                tocAffix.hide();
                toc.show();
            }
            $(document.body).scroll();
        }

        function windowResize() {
            //toc right
            var paddingRight = parseFloat(markdown.css('padding-right'));
            var right = ($(window).width() - (markdown.offset().left + markdown.outerWidth() - paddingRight));
            toc.css('right', right + 'px');
            //affix toc left
            var newbool;
            var rightMargin = (markdown.parent().outerWidth() - markdown.outerWidth()) / 2;
            //for ipad or wider device
            if (rightMargin >= 133) {
                newbool = true;
                var affixLeftMargin = (tocAffix.outerWidth() - tocAffix.width()) / 2;
                var left = markdown.offset().left + markdown.outerWidth() - affixLeftMargin;
                tocAffix.css('left', left + 'px');
            } else {
                newbool = false;
            }
            if (newbool != enoughForAffixToc) {
                enoughForAffixToc = newbool;
                generateScrollspy();
            }
        }
        $(window).resize(function () {
            windowResize();
        });
        $(document).ready(function () {
            windowResize();
            generateScrollspy();
        });

        //remove hash
        function removeHash() {
            window.location.hash = '';
        }

        var backtotop = $('.back-to-top');
        var gotobottom = $('.go-to-bottom');

        backtotop.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            if (scrollToTop)
                scrollToTop();
            removeHash();
        });
        gotobottom.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            if (scrollToBottom)
                scrollToBottom();
            removeHash();
        });

        var toggle = $('.expand-toggle');
        var tocExpand = false;

        checkExpandToggle();
        toggle.click(function (e) {
            e.preventDefault();
            e.stopPropagation();
            tocExpand = !tocExpand;
            checkExpandToggle();
        })

        function checkExpandToggle () {
            var toc = $('.ui-toc-dropdown .toc');
            var toggle = $('.expand-toggle');
            if (!tocExpand) {
                toc.removeClass('expand');
                toggle.text('Expand all');
            } else {
                toc.addClass('expand');
                toggle.text('Collapse all');
            }
        }

        function scrollToTop() {
            $('body, html').stop(true, true).animate({
                scrollTop: 0
            }, 100, "linear");
        }

        function scrollToBottom() {
            $('body, html').stop(true, true).animate({
                scrollTop: $(document.body)[0].scrollHeight
            }, 100, "linear");
        }
    </script>
</body>

</html>